百炼 2981:大整数加法

1、memset(void *s,int ch,size_t n),数组初始化;

2、an1+an2,结果存放到an1中,节省空间,好操作;

3、字符和数字之间的转换,先输入到字符数组中,再转换到int数组中,char-‘0’=int,即‘8'-‘0’=8;

4、输出显示时,设计一个bool变量,去掉整个数组中第一个数字出现的多余的0;

5、不能忘记特殊情况:0+0时的特殊处理,当bool变量在第4点的处理过程中还是原值时,就输出0;

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 200

int main()
{

    int an1[MaxSize+10];
    int an2[MaxSize+10];
    char input1[MaxSize+10];
    char input2[MaxSize+10];
    int i,j;

    //先输入两个加数的值,然后存放在字符串数组中
    scanf("%s %s",input1,input2);
    //printf("%s %s",input1,input2);
    //用memset对an1和an2数组初始化
    memset(an1,0,sizeof(an1));
    memset(an2,0,sizeof(an2));

     //   for(i=0;i<strlen(input1);i++)
   // printf("%d %d",an1[i],an1[i]);
    //将输入到input1,input2字符数组中的字符转换为数字形式
    int nLen1=strlen(input1);
    for(i=nLen1-1,j=0;i>=0;i--,j++)
    {
        an1[j]=input1[i]-'0';
    }
    int nLen2=strlen(input2);
    for(i=nLen2-1,j=0;i>=0;i--,j++)
    {
        an2[j]=input2[i]-'0';
    }
    //for(i=0;i<strlen(input1);i++)
   // printf("%d %d",an1[i],an2[i]);
   //开始计算,将结果保存到an1中,注意进位
   int temp=0;
    for(i=0;i<MaxSize;i++)
    {
       temp=an1[i]+an2[i];
       if(temp/10==0)
       {
         an1[i]=temp;
       }else{
        an1[i]=temp%10;
        an1[i+1]+=1;
       }
    }
    //输出,跳过开始为0的值,从an1 下标由大到小输出
    int startoutput=0;//加入这个bool变量是为了当发现第一个非0数后一会就不用判断是否为0了,直接输出剩余的数组值
    for(i=MaxSize;i>=0;i--)
    {
        if(startoutput)
            printf("%d",an1[i]);
        else if(an1[i])
        {
            printf("%d",an1[i]);
            startoutput=1;
        }
    }
    //之前提交一直wrong answer,看了大家做的,才知道自己忽略了0+0的情况
    if(startoutput==0)//or if(!startoutput)
        printf("0");

    return 0;
}

实验结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值