c语言程序设计--对称数

又得麻烦你们了……
对称数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:

输入一个整数,找出大于该整数的最小对称数,并输出两者之差。
所谓对称数,是指一个数的数符按顺序颠倒后构成的数与原数相同。如27672、12321、1221、88等。

输入:

一个整数

输出:

输入的整数,大于该数的最小对称数,两者之差。
共输出三个整数,中间用逗号(半角)分开,无空格。最后换行。

输入样例:

11436

输出样例:

11436,11511,75

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
char str[10]={0};
int a,b, num,i,j;
gets(str);
num=strlen(str);

a=atoi(str);
if(num%2==0)
{
if(str[num/2-1]<str[num/2])
str[num/2-1]=str[num/2-1]+1;
for(i=0,j=num-1;i<=num/2;i++,j--)
{
str[j]=str[i];
}
if(str[num/2-1]<str[num/2])
//str[num/2]=str[num/2]+1;
for(i=0,j=num-1;i<=num/2;i++,j--)
{
str[j]=str[i];
}

}

if(num%2!=0)
{

str[num/2]=str[num/2]+1;
for(i=0,j=num-1;i<=num/2;i++,j--)
{
str[j]=str[i];

}
}

b=atoi(str);
printf("%d,%d,%d\n",a,b,b-a);
return 0;

}
真不知道哪里还有问题,感觉可以了啊!五个测试点还有两个通不过……呜呜!

1、首先打开电脑,然后在电脑中找到并打开Dev-c++软件,编写代码的整体框架。

2、然后输入要查找的范围100--999。

3、输入查找范围之后,接下来可以在for之前补充定义三个变量。

4、然后取出这个数的各个位数。

5、接下来开始编写if判断语句,就完成了。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-23
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
char str[10]={0};
int a,b, num,i,j;
gets(str);
num=strlen(str);

a=atoi(str);
if(num%2==0)
{
if(str[num/2-1]<str[num/2])//未考虑str[num/2-1]==str[num/2]的情况,比如2443
str[num/2-1]=str[num/2-1]+1;
for(i=0,j=num-1;i<=num/2;i++,j--)
{
str[j]=str[i]; //2443算出来变2442,错误
}
if(str[num/2-1]<str[num/2])
//str[num/2]=str[num/2]+1;
for(i=0,j=num-1;i<=num/2;i++,j--)
{
str[j]=str[i];
}

}

if(num%2!=0)
{

str[num/2]=str[num/2]+1; //不需要上来就+1,未必有这个必要,
//比如231,应是232,不是242
for(i=0,j=num-1;i<=num/2;i++,j--)
{
str[j]=str[i];

}
}

b=atoi(str);
printf("%d,%d,%d\n",a,b,b-a);
return 0;

}

===============================================
按照你的算法,我写了个实现:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
char str[10]={0};
int a,b, num,i,j;
int index;
do{
gets(str);
num=strlen(str); //如果直接输入回车,str是空字符串,下面的计算无法进行
}while(num==0);

a=atoi(str);
index=num/2-1;

/*找出离数字“中心”最近的第一个不对称的位置*/
while(index>=0 && str[index]==str[num-index-1])
{
index--;
}
if(index>=0)
{
if(str[index]<str[num-index-1])
{
int index2=num/2;
/*如果是9,不能再累加了,必须往高位找*/
while(str[index2]=='9')
{
index2--;
}
/*由于str[index]<str[num-index-1]<='9'
* 所以index2肯定能找到,不会出现index2<0的情形
*/
str[index2]=str[index2]+1;
str[num-index2-1]=str[index2];

/*高位累加后,中间位置可以清零,数会比较小*/
for(i=index2+1; i<num-index2-1; ++i){
str[i]='0';
}
}
for(i=0,j=num-1; i<=index; i++,j--)
{
str[j]=str[i];
}
}

b=atoi(str);
printf("%d,%d,%d\n",a,b,b-a);
return 0;
}本回答被提问者采纳
第2个回答  2011-01-12
你的计算里有许多 num/2 ,可以在前面 用 int n5; n5 = num/2; 只算一次,程序里的 num/2 改写为 n5。这能省很多时间。
你的计算原理,我没能看懂,所以没给你改。

有个简单的/笨的方法,就是原数加1,一个一个查找对称数,时间不知道是否满足要求:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char str[10]={0}, s2[10];
int num,n,n5,i;
_int64 aa,bb,cc;

gets(str);
num = strlen(str);
sscanf(str,"%I64d", &aa);
if (aa < 11){
bb = 11;
printf("%d,%d,%d\n",aa,bb,bb-aa);
return 0;
}
bb = aa;
while (1){
Lab:
bb = bb+1;
sprintf(s2,"%I64d", bb);
n= strlen(s2);
n5 = n/2;
i=0;
do {
if (s2[i] !=s2[n-i-1]) goto Lab;
i++;
} while( i < n5);
break;
}
printf("%I64d,%I64d,%I64d\n",aa,bb,bb-aa);
return 0;
}
供参考。
第3个回答  2017-12-11
楼上有一个代码找的是大于等于输入的回文数有违题意,而且在从中间判断9的时候位置并不准确,稍加修改后代码如下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int f(int n){ //10的n次方
int ans=1;
while(n--) ans*=10;
return ans;
}
int main()
{
char str[10]={0};
int a,b=0, num,i,j;
int index;
do{
gets(str);
num=strlen(str); //如果直接输入回车,str是空字符串,下面的计算无法进行
}while(num==0);
a=atoi(str);
index=num/2-1;
/*找出离数字“中心”最近的第一个不对称的位置*/
while(index>=0 && str[index]==str[num-index-1])
{
index--;
}
if(index>=0) //若输入的不是回文数
{
if(str[index]<str[num-index-1])
{
int index2=num/2-1;
index2 += (num%2) ? 1 : 0;
/*如果是9,不能再累加了,必须往高位找*/
while(str[index2]=='9'&&index2>=0)
{
index2--;
}
/*由于str[index]<str[num-index-1]<='9'
* 所以index2肯定能找到,不会出现index2<0的情形
*/
str[index2]=str[index2]+1;
str[num-index2-1]=str[index2];
/*高位累加后,中间位置可以清零,数会比较小*/
for(i=index2+1; i<num-index2-1; ++i){
str[i]='0';
}
}
for(i=0,j=num-1; i<=index; i++,j--)
{
str[j]=str[i];
}
}
else { //若输入的数就是回文数,参照上边打的
int index2=num/2-1;
index2 += (num%2) ? 1 : 0;
while(str[index2]=='9'&&index2>=0) index2--;
if(index2>=0){
str[index2]=str[index2]+1;
str[num-index2-1]=str[index2];
}
for(i=index2+1; i<num-index2-1; ++i){
str[i]='0';
}
if(index2<0){ //若输入全是9
b=f(num)+1;
}
}
b+=atoi(str);
printf("%d,%d,%d\n",a,b,b-a);
return 0;
}
第4个回答  2022-07-08
unsigned int c;
unsigned int b;
unsigned int temp,temp1;

scanf("%d",&c);
temp1 = c;
while(temp1)
{
temp = temp1%10;
temp1 /= 10;
b *= 10;
b += temp;
}

if(c == b)
{
printf("\r\n Yes");
}
else
{
printf("\r\n No");
}

c语言程序设计--对称数
1、首先打开电脑,然后在电脑中找到并打开Dev-c++软件,编写代码的整体框架。2、然后输入要查找的范围100--999。3、输入查找范围之后,接下来可以在for之前补充定义三个变量。4、然后取出这个数的各个位数。5、接下来开始编写if判断语句,就完成了。

编程c语言程序,输入一个五位数,判断是否为对称说,如:12321,20202都是对 ...
判断数据\/10000是否等于数据%10,并且(数据%10000)\/1000是否等于 (数据%100)\/10如果这两个条件都满足,则是对称数,否则不是。include "stdio.h"\/\/ void main(void){ int nDec;printf("请输入一个十进制五位整数...\\nnDec=");for(;;){ zhiscanf("%d",&nDec);if(nDec>9999 && nDec<100...

C语言:对称数及排序
代码如下:

c语言 统计100到1000之间的对称数的个数
include <stdio.h>#include <conio.h>int main(){ int n=0,i; for(i=100;i<1000;++i){ if(i%10==i\/100)++n; \/\/如果个位数和百位数相同,则计数 } printf("n=%d",n); getch(); return 0;}

用C语言编程实现判断输入的某个三位数是否是对称数
include<stdio.h> include <string> using namespace std;void PanDuan(){ int n;printf("请输入一个三位数\\n");scanf("%3d",&n);char num[3];itoa(n,num,10);if (num[0]==num[2])printf("%s","对称");else printf("%s","不对称");} void main(){ PanDuan();} ...

C语言编程,求五位正整数中所有对称数如78787
void main(){ int long i;printf("%d\\n",15%4);for (i=10000;i<=99999;i++)if ((int)(i\/10000)==(i%10))if (((int)(i\/1000))%10)==(((int)(i\/10))%10))printf("%ld\\n",i);}

C语言:判断一个四位数是不是对称数
if ( x%10000\/1000==x%10 && x%1000\/100==x%100\/10 ) printf("是对称数\\n");else printf("不是对称数\\n");

c语言:对称三位数素数
include"stdio.h"void main(){ int i,j,k,n,m;for(i=1;i<=9;i++){ for(j=0;j<=9;j++){ for(k=1;k<=9;k++){ if(i==k){ n =100*i+j*10+k;for( m=2;m<n\/2;m++){ if(n%m==0)printf("%d%d%d\\n",i,j,k);break;} } } } } } 请参考 ...

c语言求对称数
void main(){ void f(int A);int a1,a3;scanf("%d",&a1);for(a3=1;a3<=a1;a3++)f(a3);} void f(int A){ int i,t1,t2,A2=A*A,a[20];\/\/ printf("%d\\n",A);for(i=0,t1=0;A2!=0&&i<20;i++){ a[i]=A2%10;A2\/=10;t1++;} t2=t1-1;i=0;while(a[i]==...

C语言判断一个整数是否为对称数?
for(i=1;i<=y;i++)a=a\/10;for(i=1;i<=y;i++){c=c*10+b%10;b=b\/10;} if (a==b) printf("yes\\n") ;else printf("NO\\n");} 思想就是将整数分成2半,后一半倒序,然后判断是否相等,例如52125 :前一半为52,后一半为25,倒序为52,与前一半相等,为对称数^_^ ...

相似回答