寒假集训学习记录 1.16

  emmm,第一篇博客,着实有点不知道该写什么。第一次写应该不怎么样,见谅见谅。

  自从学习c语言以来,对自己出现错误的各种方式我自己都觉得奇葩又离谱,在这里提醒一下,敲代码之前好好看题面和样例,敲代码的时候也仔细一点嗷。

   今天就写写有关大数求和吧,大数求和里值得注意的就是进位问题,还有最高位是否进位的问题。(自我认为哈)

  写大数嘛,就是因为大,所以才选择用字符串的,有关思路就是就是先比较两个字符串长度的大小,大的放在前面,然后从最后开始依次相加,剩下就是进位问题啦,解决了这个就很容易啦!

这里比较长度最直接的方法就是strlen()嘛,当然还可以这样:

下面这是完整的代码

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 #define N 1009
 6 char a[N],b[N],c[N];
 7 int main(){
 8     while(scanf("%s %s",a,b)!=EOF){
 9         memset(c,0,sizeof(c));
10         int la=strlen(a),lb=strlen(b),tp=0;
11         int li=min(la,lb),lx=max(la,lb);//像这里直接在令俩变量
12         //整合: 
13         /*
14         模拟:从低位开始相加,大于9就要进位,用变量tp表示是否进位,1就进位,0就不进位 
15         需要注意的是,当最后最高位大于9时,需要额外输出一个1表示进位 
16         */ 
17         for(int i=1;i<=lx;++i){
18             if(i<=li) c[lx-i]+=b[lb-i]+a[la-i]-'0';
19             else{
20                 if(la>lb)c[lx-i]+=a[la-i];
21                 else c[lx-i]+=b[lb-i];
22             }
23             if(c[lx-i]>48+9){
24                 if(i==lx) tp=1;
25                 c[lx-i-1]+=1;
26                 c[lx-i]-=10;
27             }
28         }
29         if(tp) putchar('1');
30         puts(c);
31     }
32     return 0;
33 }

嗯,其实意思都一样嘛,然后就是要从最后开始相加:

1 for(int i=1;i<=lx;++i){
2     if(i<=li) c[lx-i]+=b[lb-i]+a[la-i]-'0';//*就是这个啦,应该都能理解的
3     else{
4         if(la>lb)c[lx-i]+=a[la-i];
5          else c[lx-i]+=b[lb-i];
6        }

然后就是最关键的进位问题了,说实在的,我之前总觉得大数可难可难了。事实证明,凡事还是得多思考的。

if(c[lx-i]>48+9){//这里之所以是48+9 因为是char类型嘛
    if(i==lx) tp=1;
    c[lx-i-1]+=1;
    c[lx-i]-=10;
    }

嗯,差不多就是这样啦,最后每天一句:我是一个小废物。加油!

 

posted @ 2021-01-16 21:58  臭小鬼zm  阅读(51)  评论(0编辑  收藏  举报