栾静怡


私信TA

用户名:uq_69767536335

访问量:275

签 名:

小楫轻舟,已然梦入芙蓉浦。

等  级
排  名 1535
经  验 2818
参赛次数 2
文章发表 27
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

好好学习 天天向上 。

解题思路:

注意事项:

参考代码:

#include<stdio.h>

#include<string.h>

//因为我下面有用strlen( )函数,所以需要用头文件“#include<string.h>”

//虽然codeblocks里面不用这个头文件好像也可以,但是实际上不用是不符合c语言标准的好像

int main ( )

{

    char a1[200]={0} ,a2[200]={0} ;

//为了防止出现意外意外情况,我让每一个数组的初始值都为0

    int sum[201]={0} ;

//可能是9999+1111这样子的,他们和的位数会超过200位,所以定义数组 sum 长度201 ;

/*这里必须初始化为0,如果9999+2000就会难以解决,看到后面应该就知道我为什么这么说了*/

    int b1=0 , b2=0 ;

//原来方便记录 a1 和 a2 的长度 ;

    scanf("%s %s",a1 ,a2 ) ;

//这题用"%s\n%s"也可以,我试过了,能过

//因为我想把他们当成一个个整体存储,所以用字符串类型%s输入

//又因为数组名就是这个数组的首地址,所以不用&a1

//如果用 &a1[200] 就表示取 数组 a1 的第二百个元素的地址 ;

    b1=strlen(a1) ;

    b2=strlen(a2) ;

//用strlen( ) 方便计算数组 a1 和 a2 的长度 ;

    int c1[201]={0} ,c2[201]={0} ;

/*为什么这里不能用c1[b1]={0} 这样的?因为不符合c 标准,c标准要求数组的长度在编译前就是常量表达式 ,例如 ”1+1“或者”2“ 这样子的 ,虽然有一些编译器可能会支持c1[b1],并且还不支持赋初值,然后就是c语言网不支持c1[b1]这种 */

//我想要用数组 c1 和 c2 分别记录下 数组 a1 和数组 a2 中的每一个数字

//然后再通过让数组 c1 和 数组 c2 中的每一个对应的元素相加,求出sum ;

//通过遍历输出数组 sum 中的每一个元素的方式把数组 a1 和数组 a2 的和求出来

    for ( int i=0 ; i<=b1-1 ; i++ )

        {

        c1[b1-1-i]=a1[i]-'0' ;

        }

//把存储字符串元素的数组转化为存储单个数字的数组,通过ascii码

// 0到9的ascii码是从30到39

/* 用 c1[b1-1-i] = a1[i] ; 是因为

    假如数组 a1[5]=="1234" ,那么正常用 c1[i]=a1[i] 就会出现 c1[0]=a1[0]=1 的情况

而我们知道 a1[0]==1 这个“1”其实是 "1234“的最高位 ,如果我们此时不倒序输入c1,那么我们接下去的计算就无法用正常方式进行进位,为了避免麻烦的思考,所以我干脆一开始就让它倒序输入算了  */

    for ( int i=0 ; i<=b2-1 ; i++ )

        {

        c2[b2-1-i]=a2[i]-'0' ;

        }

    int max=(b1>b2) ? b1 : b2 ;

//定义一个变量max 把它赋值为 b1 和 b2 中的最大值

//为了确定相加的最大次数

    for ( int i=0 ; i<=max-1 ; i++ )

        {

        sum[i]=c1[i] + c2[i] + sum[i] ;

//正常来说其实是不用加sum[i]的 但是前一个元素的时候可能超过了10

//为了确保计算正确性,所以加sum[i]

/* 这里也是我觉得数组 sum 必须初始化为 0 的原因,不初始化为0 ,我无法保证sum[0]会等于什么 */

        if ( i== max-1 && sum[max-1]>=10 )  max++ ;

/* 万一真的出现9999+1111这些类似的情况,我就在最前面增加一位数的位置,也是因为我后面那个 if( ) 我才这么做的 */

        if ( sum[i]>=10 )

            {

            sum[i+1]=sum[i+1]+sum[i]/10 ;

            sum[i]=sum[i]%10 ;

            }

//这里我也不知道怎么说好,所以我决定用例子说明

/* 假设sum[5]=c1[5]+c2[5]+sum[5] ,其中c1[5]==3 ,c2[5]==8,sum[5]==0,sum[6]==0 ;

    那么sum[5]==11 ;

    sum[6]=sum[6]+sum[5]/10 ;

    那么sum[6]=0+11/10==1 ;

    然后下一次循环 sum[6]=c1[6]+c2[6]+sum[6] ; 这样子我就成功地实现了进位 */

}

    int k=0 ;

//为了控制不要输出前导 0

    for ( int i=max-1 ; i>=0 ; i-- )

        {

        if(sum[i]!=0) k=1 ;

//一直到遇见第一个非0 数字,我才让计算机开始输出

        if(k!=0) printf("%d",sum[i] ) ;

/*这里千万千万不要用 %c 输出 不然输出结果挺好看的,大家好奇的话也可以去试试看,我试过了,我就这么错过,我觉得这输出结果至少比我空手画的好看多了 */

/* 因为我们前面已经把数组 a1 和 数组 a2 的字符串类型 转化成了 整型 的数组 c1 和数组 c2 了,然后我们定义的数组 sum 也是 int型 的,所以要用 %d 占位 */

        }

    return 0 ;

}


 

0.0分

0 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »