用c语言怎么写? 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

2026年09月26日 15:13
有1个网友回答
网友(1):

这题就是让你用一个数组表示一个数字,比如int n[3]={12,13,14}就是表示121314这个6位整数,并使用这个数组表示的整数模拟整数+1的运算。

思路就是从数组最后一个元素的整数开始做+1运算,最高进位,则进位到数组前一个元素整数中,以此类推,如数组第一个元素的数字最高位也进位,则表示溢出,超出该数组表示的范围。

由于题目没有限制数组大小及每一个元素所能表示的位数,我这里代码数组大小及元素数字最大位数用常量M和L表示,可修改(默认数组大小5个元素,每个元素表示2位数字,也就是数组最大表示10位整数)。

由于数字均为随机数,位数低于元素最大位数时,输出打印需补0.

所有功能均独立函数,详细见备注。

#include

#include

#include

#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

    for(i=0;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

        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

        *n-=t;

        return 1;

    }

    return 0;

}