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语言程序设计--对称数的主要内容,如果未能解决你的问题,请参考以下文章