题目描述
Birdfly是一位优秀的acmer,他自幼都数学有着浓烈的兴趣。作为一名集训队员,总爱思考一些新奇的问题,寻求不同的解题方法。
Birdfly一直坚信freshmen的潜力是无穷的!因为你们是ZZULI ACM的未来!ACM的题目并不是那么简单,但这一题so easy!^_^
一天晚上,birdfly躺在床上毫无睡意……他想,任意给你一个整数,这个数可能很大(最长不超过100位),你能求出它的逆转数吗?
逆转数定义如下:
1.一个末尾没有0的整数,它的逆转数就是各位数字逆序输出;
2.一个负数的逆转数仍是负数;
3.一个末尾有0的整数,它的逆转数如同下例:reverse (1200) = 2100。
看着birdfly难以入睡,我只好求助于聪明的你编程实现这个问题,相信你一定能帮上忙的!
输入
输入数组有多组, 每组测试实例包含一个大数且占一行。
输出
对每组测试实例,输出它的逆转数。每组占一行。
样例输入 Copy
0 54 -8989 -54600 100000
样例输出 Copy
0 45 -9898 -64500 100000
/*刚开始以为要用指针,后来发现可以不用*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 100
void reverse(char str[]) /*用函数判断更简洁*/
{ int min=0; /*定义变量*/
int i,len,count=0,flag=0;
len=strlen(str);
if(str[0]=='-') /*先判断第一位是不是负数*/
{
min=1;/*有“-”就把min变为1*/
printf("-");/*负数还是负数*/
}
for(i=len-1;i>=1;i--)/*要逆转数,所以倒着找,另外str[0]因为可能是-,所以拎出来*/
{ if(str[i]=='0'&&flag==0)/*如果倒数第一位是0,标记,跳过,同时count+1*/
{
count++;
continue;
} /*如果不是0或者是0但是0没有连续(比如1040,0之后是4,4不为0,输出,flag标记,
4之后还是0,但是flag已不是0,所以不跳过,进入下一个if语句,这时虽然是0,但是flag不是0)
所以 还是直接输出*/
if(str[i]!='0'||flag!=0)
{
printf("%c",str[i]);
flag=1;
}
}
if(min==0)/*min是0就代表没有-*/
{ /*接着输出最后一位str[0]*/
printf("%c",str[0]);
}
for(i=1;i<=count;i++)/*最后再把0补充上去*/
printf("0");
}
int main()
{
char str[101];
while(gets(str))
{
reverse(str);
printf("\n");
}
return 0;
}