C 语言程序设计100 例之( 6):数字反转
例 6数字反转
题目描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,
即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。输入格式
一个整数N
输出格式
一个整数,表示反转后的新数。
输入样例#1
123
输出样例#1
321
输入样例#2
-380
输出样例#2
-83
(1)编程思路。
将一个非负整数number 各位上的数字依次分离出来,其操作步骤为:
1)分离出number 的个位数,即number%10 。
2)将 number 除以 10,作为新的number ,即新的number 丢掉了个位数。
3)如果  number 等于 0,分离完毕,结束。否则,转第1)步,继续显示。
例如, number=1234 , number%10=4 , number=1234/10=123 ,得到数字4;
number%10=3 ,  number=123/10=12 ,得到数字3;
number%10=2 ,  number=12/10=1 ,得到数字2;
number%10=1 ,  number=1/10=0 ,得到数字1;结束。
由数字 4、 3、 2、1 如何得到整数4321 呢?
4321=4*1000+3*100+2*10+1=4*103+3*10 2+2*10+1
右边的多项式可以采用秦九韶算法求解。
设要求解P=4*10 3+3*10 2+2*10+1
可演变为P=(((0*10+4)*10 +3)*10+2)*10+1。
这样,可令  P 初值为 0,每给定一个数字a,执行  P=P*10+a 即可。
由数字 4、 3、 2、1 得到整数  4321 的过程描述为:
P=0  ,给出数字  4 ,P= 0*10+4 =4 ;之后数字  3 ,  P=4*10+3= 43 ;
之后数字2, P= 43*10+2 =432;最后数字  1 , P=432*10+1= 4321 。
将上述两个操作结合起来,一边分离出number 的各位上的数字,一边将其拼到逆序数P 上去,这样可将求number 逆序数  P 的过程写成一个简单的循环。
P=0;
While (number!=0){ p=p*10+number%10;number=number/10;}
(2)源程序。
#include <stdio.h>
int main()
{
int n,m,f;
scanf("%d",&n);
m=0; f=1;
if (n<0)
{
n=-n;
f=-1;
}
while (n!=0)
{
m=m*10+n%10;
n/=10;
}
m=f*m;
printf("%d\n",m);
return 0;
}
习题 6
6-1回文数的个数
题目描述
“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,
如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,称为回文数
(p alindrome number )。
设 n 是一任意自然数。若将n 的各位数字反向排列所得自然数n1 与 n 相等,则称n 为一回文数。例如,若n=1234321 ,则称  n 为一回文数;但若n=1234567 ,则 n 不是回文数。
例如, 10 到 100 之间的回文数有11,22,33,44,55,66,77,88,99 共 9 个。
输入格式
两个整数  a 和 b( 10≤ a≤ b≤ 65535)。
输出格式
一个整数,表示整数  a 和 b 之间所有回文数的个数。
输入样例
10 100
printf直接输出数字输出样例
9
( 1)编程思路。
一个正整数如果其逆序数与其相等,则它一定是一个回文数。按例  6 的方法编写一个函
数 int inverse(int n) 求整数  n 的逆序数。
( 2)源程序。
#include<stdio.h>
int inverse(int n)
{
int s=0;
while (n!=0)
{
s=s*10+n%10;
n/=10;
}
return s;
}
int main()
{
int a,b,cnt,i;
while(scanf("%d%d", &a,&b)!=EOF)
{
cnt=0;
for (i=a;i<=b;i++)
if (i==inverse(i)) cnt++;
printf("%d\n", cnt);
}
return 0;
}
6-2回文数猜想
本题选自杭州电子科技大学OJ题库
( acm.hdu.edu/showproblem.php?pid=1282 Problem Description
一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,
这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其
和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68 变成154(68+86),605 154+4511111 605+5061111
一个猜想:不论开始是什么正整数,在经过有限次正序数和倒序数相加的步骤后,都会得到
一个回文数。至今为止还不知道这个猜想是对还是错。现在请你编程序验证之。
Input
每行一个正整数。
特别说明:输入的数据保证中间结果小于2^31 。
Output
对应每个输入,输出两行,一行是变换的次数,一行是变换的过程。Sample Input
27228
37649
Sample Output
3
27228--->109500--->115401--->219912
2
37649--->132322--->355553
( 1)编程思路。
同样编写一个函数int inverse(int n) 求整数 n 的逆序数。
( 2)源程序。
#include<stdio.h>
int inverse(int n)
{
int s=0;
while (n!=0)
{
s=s*10+n%10;
n/=10;
}
return s;
}
int main()
{
int m,cnt,t;
while(scanf("%d",&m)!=EOF)
{
cnt=0;
t=m;
while (t!=inverse(t))
{
cnt++;
t=t+inverse(t);
}
printf("%d\n",cnt);
printf("%d",m);
while (cnt--)
{
m=m+inverse(m);
printf("--->%d",m);
}
printf("\n");
}
return 0;
}
6-3叛逆的小明
本题选自杭州电子科技大学OJ题库
( acm.hdu.edu/showproblem.php?pid=4554
)Problem Description
叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:小明会把 1234 它看成4321;把 -1234 看成 -4321 ;把 230 看成 032 (032=32);把 -230 看成 -032(-032=-32) 。现在,小
明做了一些 a+b 和 a-b 的题目 (a, b 为整数且不含前导 0),如果给你这些题目正确的答案,你能猜出
小明会做得到什么答案吗?
Input
输入第一行为一个正整数T(T<=10000),表示小明共做了T 道题。
接下来  T 行,每行是两个整数x,y(-1000000<=x, y<=1000000), x 表示
a-b 的正确答案。
a+b 的正确答案,y 表示
输入保证合法,且不需考虑  a 或 b 是小数的情况。
Output
输出共T 行,每行输出两个整数s t ,之间用一个空格分开,其中s 表示小明将得到的a+b 答案,t 表示小明将得到的a-b答案。
Sample Input
3
20 6
7 7
-100 -140
Sample Output
38 24
7 7
-19 -23
( 1)编程思路。
由于输入的x 和 y 是正确答案,即x=a+b ,y=a-b。可求得分别求得  a 和 b 的逆序数  c 和 d,这是小明的运算数,输出a=(x+y)/2 , b=(x-y)/2 。c+d 和 c-d 即可。
( 2)源程序。
#include<stdio.h>
int inverse(int n)
{
int s=0;
while (n!=0)
{
s=s*10+n%10;
n/=10;
}