数组内存放了一些个位数字,组成一个大数(从高位到低位),现在将这个数加 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");