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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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判断语句,就完成了。

参考技术A #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;
本回答被提问者采纳
参考技术B 你的计算里有许多 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;

供参考。
参考技术C 楼上有一个代码找的是大于等于输入的回文数有违题意,而且在从中间判断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;
参考技术D 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语言中求两数相乘的程序

最好详细一点.

思路:double类型的范围: -1.7*10(-308)~1.7*10(308),如果两个数的乘积不超过这样的精度,可以直接使用*符号进行运算。

参考代码:

#include<stdio.h>
int main()

double a,b;
scanf("%lf%lf",&a,&b);
printf("%.2lf",a*b); //保留两位小数
return 0;

/*
运行结果:
1205 5985
7211925.00
*/
参考技术A #include "stdafx.h"
#include<stdio.h>

long int main(int argc, char* argv[])

long int x,y,num;
scanf("%d,%d",&x,&y);
num=x*y;
printf("num=%d\n",num);

return 0;


已经验证过,绝对可用。输入数字式格式格式为 34,35(就是2个数字) 然后点回车,就OK了.
一楼那位仁兄的程序我调试过了,运行没问题,但是输出格式有问题,看不懂得。
参考技术B #include<stdio.h>
void main()

double d;
scanf("%lf,%lf\n",&i,&j);
d=ji(i,j);
printf("%lf",d);

double ji(double i,double j)

double z;
z=i*j;
return z;

随手遍的不知道对不对呵呵
参考技术C int main()

double a, b;
scanf("%lf %lf", &a, &b);
printf("%lg\n", a * b);
return 0;
参考技术D 这个问题太低级了吧……

以上是关于c语言程序设计--对称数的主要内容,如果未能解决你的问题,请参考以下文章

用c语言设计一个程序判断一个5×5矩阵是不是为对称矩阵。谢谢!!!

用C语言编写一个计算两个向量叉积的程序

C语言程序设计 | 打印一个n行的菱形

100个经典C语言程序(益智类)

C语言试题七十五之请编写函数求回文数

C语言试题七十五之请编写函数求回文数