北航计算机机试16逆序数
题目描述
给定一个数n,将这个数的各位顺序颠倒,称为逆序数m。
例如1234的逆序数是4321。
输入
输入一个数n(0 < n<1000000000),已知输入开头不包含多余的0。
输出
如果m是n的k倍(k为整数),那么输出n*k=m。
如果m不是n的整数倍,那么输出n和n的逆序数。
样例输入
1234
1089
23200
样例输出
1234 4321
1089*9=9801
23200 00232
嗯,100000000并没有超过int
我的机子sizeof是4位的
这个还是有点小心机的,上代码:
#include<stdio.h>
//我竟然还想着用stack或者queue
int main()
{
int num,renum,temp;
while(scanf("%d",&num)!=EOF)
{
renum=0;
temp=0;
int s=num;
int i=0;
while(s!=0)
{
temp=s%10;
s=s/10;
i++;
renum=renum*10+temp;
}
if(renum%num==0)
{
printf("%d*%d=%d\n",num,renum/num,renum);
}
else
{
printf("%d %0*d\n",num,i,renum);
}
}
return 0;
}
从这几个方面说:
1.上机给出变量范围
题目难得给出了输入范围,如果不知道这个是什么类型,可以用sizeof来判断下你机子相应类型的占的字节数,比如我的机子
sizeof(int)=4;则我的int型最大数为4*8=32位的,而题目只有10位,满足int。
2.逆序数字
这是我在atoi函数学会的,从最高位开始算,辗转乘10加个位数
3.输出格式
题目中有说输入时前面不会有无聊的‘0’,但测试用例中,12300的逆序数是00321,则代表输出是有要求的
简单的说一下Printf的格式
原型:int printf(const char *format, …)
控制字符串(format):
普通字符:原封不动地复制到输出流中;
转换说明;
转换说明一般形式为:
%[flags] [ width] [.prec] [l] type
其中type为格式转换字符。
* 通过参数(只有域宽)来输入所需的数据域宽*
int width = 10;
printf(“%* d”, width, result); /* 以10个字符长的宽度输出result */
printf(“:%* .* d:\n”, 10, 6, 100); /* 即域宽为10,6位数,右对齐 */
结果为 : 000100: 前面有四个空格
printf的格式控制的完整格式:
% - 0 m.n l或h 格式字符
下面对组成格式说明的各项加以说明:
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。*对于字符串.n表示用于指定从字符串左侧开始截取的子串字符个数。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。