寒假集训学习记录 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; }
嗯,差不多就是这样啦,最后每天一句:我是一个小废物。加油!