[C语言]给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。该数字按照数位高低进行排列,最高位的数在列表的最前面。

//给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一
//eg: [9, 9, 9] -> [1, 0, 0, 0]

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 5//数组大小
#define L 2//数组每个元素的数字最大位数
void init(int num[M]);//初始化数组
void printNum(int num[M]);//打印数组内容
int addAndCheckOverFlow(int *n,int y);//当前数字+1并检查最高位是否溢出,溢出返回1,不溢出返回0
int add_1(int num[M]);//从数组最后一个元素数字开始+1,如有溢出,则进位加至前一个数组元素的数字,如此循环。如数组第一个元素溢出则返回1表示超出数组表示范围。否则返回0

int main()
{
    int num[M]={0},y;
    srand(time(NULL));
    init(num);
    printf("随机生成的数组内容为:\n");
    printNum(num);
    y=add_1(num);
    if(y)
        printf("加一后,最高位溢出,数组内容为:\n"),printNum(num);
    else
        printf("加一后,数组内容为:\n"),printNum(num);
    return 0;
}
void init(int num[M])
{
    int i,n=1;
    for(i=0;i<L;n=n*10,i++);
    for(i=0;i<M;i++)
        num[i]=rand()%n;//用随机2位数填充数组
}
void printNum(int num[M])
{
    int i,j,n,m;
    char nStr[L+1]={0};
    for(i=0;i<M;printf("%s ",nStr),i++)
        for(j=L-1,n=num[i];j>=0;j--){//将每个元素数字从最低位开始读,位数低于L,该位补0,补位后的数字字符组成字符串打印输出
            m=n%10;
            if(m) nStr[j]=48+m;
            else nStr[j]='0';
            n=n/10;
        }
    printf("\n");
}
int add_1(int num[M])
{
    int i,y=1;//y即表示进位,也作为初始的加数
    for(i=M-1;i>=0;i--){
        y=addAndCheckOverFlow(&num[i],y);
        if(!y) break;
    }
    return y;
}
int addAndCheckOverFlow(int *n,int y)//当前元素数字+1并检查最高位是否溢出,溢出返回1,不溢出返回0
{
    int i,t=1,num=*n,len1=1,len2=1;
    while((num=num/10))len1++;//加1前的位数
    num=*n,num=num+y;
    *n=num;
    while((num=num/10))len2++;//加1后的位数
    if(len2>len1)
    {
        for(i=1;i<len2;t=t*10,i++);
        *n-=t;
        return 1;
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值