[NOIP2011]数字反转
- 1.题目
- 2.分析
- 3.代码
-
- 方法1:不用数组,依次输出每一位
- 方法2:用字符数组
- 方法3:每一位乘以对应的次方再相加
- 方法4:先消除前导0
- 4.总结
- 5.更新日志
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 整理