计蒜客-加一

数组内存放了一些个位数字,组成一个大数(从高位到低位),现在将这个数加 1,并输出加一以后的结果。

例如:

A = [2,3,1,1,4]

则结果为

[2,3,1,1,5]

A = [7,8,9]

则结果为

[7,9,0]

输入格式

第一行输入一个正整数 n(1≤n≤100),接下来的一行,输入用空格分隔的 n 个 0到 9 的非负整数组成的数组 A[n]。

输出格式

输出一行,nn 个用空格分隔的整数,表示加一后的新数组。

样例输入

5
8 9 9 9 9

样例输出

9 0 0 0 0

思路

其实就是把数组最后的一位加一,用循环从后往前进行判断是否能进位,不能的话则输出数组,那么有一个很关键的在于我们的数组大小是n,如果输入的数为[9 9 9 9 9],这种情况下,我们的数组会溢出,解决办法之一就是多构建一个数组,把计算完之后所有的数字全部存在新的数组里面。
但是,我觉得那样做有点麻烦,所以想了个取巧的办法,当最高位为9时,它撑死就进1,所以我们可以先用if进行判断,然后先把数字之前的最高位归0,然后用printf打印一个1在最开头,这样就就解决了数组溢出的问题,我们也不用再构建一个数组。

例如:[9 9 9 9 9]

加一之后,所有位都进一,所以我们先把满足进位条件的那位先置0,在把高位加1
到最高位的时候,我们就先用printf打印一个1,然后把最高位置0,这时候我们数组里面存的就是[0 0 0 0 0],但是由于先打印了1,最后我们的结果就是 1 0 0 0 0 0.

代码如下:

#include<stdio.h>
int main(){
    int n;
    int A[100];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&A[i]);
    }
    A[n-1]+=1;         //先把最低位加一
    int j=n-1;           //把数组大小赋值给j
    while(1){
        if(A[j]>9){     //如果数组大于9,则进位,并把该位置0
             A[j]=0;
            A[--j]+=1;
            if(j==0&&A[j]==10){      // 如果最高位等于10
                A[0]=0;                        //先置0
                printf("1 ");                 //然后再打印一个1作为最高位
                break;
            }
        }
        else if(A[j]<10)              //如果哪一位不能到10,意味着不能进位,跳出循环
            break;
    }
     for(int k=0;k<n;k++){
         printf("%d ",A[k]);       //打印数组
     }
}
printf("I LOVE BOSS");
点赞