C语言小题目

2024-12-22 16:55:42
推荐回答(2个)
回答1:

#include
#include
int main()
{
int N=0,i=0,freq[]={0,0,0,0,0,0,0,0,0,0},imposable=0,k=0,pos=0;
char *number=NULL,firstnum=0;
scanf("%d",&N);
number=(char*)malloc(sizeof(char)*N+1);
scanf("%s",number);
firstnum=*(number)-'0'; /*FZL数字必须大于X*/
if(*(number)=='9') /*如果X第一个数为9,FZL不满足条件*/
{
printf("0");
return 0;
}
for(i=0;i freq[*(number+i)-'0']+=1; /*记下每个数字出现的频率*/
for(i=0;i<10;i++)
{
if(freq[i]%2==0) /*回文数,最多只能有一个数字出现次数为奇数*/
continue;
imposable++; /*记下出现频率为奇数的个数*/
}
if(imposable>=2) /*测试是否只有一个以下的数字出现次数为奇数*/
{
printf("0");
return 0;
}
/*输出FZL数字*/
for(i=firstnum+1;i<=10;i++)
{
if(i==10) /*没有大于x的数字*/
{
printf("0");
return 0;
}
if(freq[i]==0||freq[i]==1) /*出现次数为1的数只能作为中间的数字*/
continue;

*(number)='0'+i; /*把第一个目标数字中*/
freq[i]-=2; /*此数字出现次数减少2次*/
break;
}
/*把其他的数字存入目标数字*/
pos=-1;
k=1;
for(i=0;i<=9;i++)
{
while(freq[i]&&freq[i]!=1) /*按从小到大一直插入目标字符串*/
{
*(number+k++)='0'+i;
freq[i]-=2;
}
if(freq[i]==1) /*记录下中间数字的位置*/
pos=i;
}
*(number+k)='\0';
/*输出数字*/
printf("%s",number); /*输出前半段*/
if(pos!=-1) /*当N是奇数时,输出中间的数字*/
printf("%c",pos+'0');
for(i=k-1;i>=0;i--) /*输出后半段*/
printf("%c",*(number+i));
free(number);
number=NULL;
getch();
}

回答2:

也不需要的保险!