当前位置: 代码迷 >> 综合 >> [NOIP2011]数字反转
  详细解决方案

[NOIP2011]数字反转

热度:55   发布时间:2023-12-04 12:14:16.0

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