1.题目
题号:NC16584
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入描述:
一个整数 N。
输出描述:
一个整数,表示反转后的新数。
示例1
输入
123
输出
321
示例2
输入
-380
输出
-83
备注:
-1,000,000,000≤N≤1,000,000,000
2.分析
难点在于取消前导0的输出
3.代码
方法1:不用数组,依次输出每一位
#include <stdio.h>
int main()
{
long long N;
int count=-1,flag=0;
scanf("%lld",&N);
if(N==0)
printf("%lld",N);
if(N<0)
{
printf("-");
N=-N;
}
while(N) //输出每一位
{
int temp=N%10;
N/=10;
count++;
if(temp!=0&&flag==0) //直到找到第一个非0的数取消打印
flag=1;
if(flag)
printf("%d",temp);
}
return 0;
}
方法2:用字符数组
#include <stdio.h>
#include <string.h>
int main()
{
char Array[15];
int i=0,j;
int len,flag=0;
scanf("%s",Array); //将数字转换为字符串输入
len=strlen(Array);
if(Array[0]=='-')
{
printf("-");
i++;
}
for(j=len-1;j>=i;j--)
{
if(Array[j]!='0'&&flag==0) //从第一次出现非0开始打印
flag=1;
if(flag)
printf("%c",Array[j]);
}
return 0;
}
方法3:每一位乘以对应的次方再相加
知识点:负数取模
#include <stdio.h>
int main()
{
long long N,Sum=0;
scanf("%lld",&N);
while(N)
{
Sum=Sum*10+N%10;
N/=10;
}
printf("%lld",Sum);
return 0;
}
方法4:先消除前导0
#include <stdio.h>
int main()
{
long long N;
scanf("%lld",&N);
if(N==0)
printf("0");
else
{
while(N%10==0) //将后面的前导0消除
{
N/=10;
}
if(N<0)
{
printf("-");
N=-N;
}
while(N)
{
printf("%d",N%10);
N/=10;
}
}
return 0;
}
4.总结
算法都有优缺点,方法3应该是最巧妙的
5.更新日志
2022.3.21 整理