[NOIP2011]数字反转

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 整理

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值