写在最前面的
这是一篇关于加法的学习笔记。大数加法在做题的时候遇到了,还以为是什么东西,当时用int挂了,用long long也挂,以为编译器的问题,__int64也挂。肯定是大数了,当然还有大数加法,大数乘法等等,下面是模板。之后也把自己写的大数模板都贴上来。
啊哈,大数加法
大数加法模板:代码思路清晰而简单。在cin或者scanf(总之是输入)之后,加数的高位在字符串的低位,低位在字符串的高位。在这里没有将输入的数字倒转,也就是说这篇代码是从读入空间直接执行加减的(此时加数的最低位都在字符串的最高位),当然如果将两个加数都reverse,执行加法的过程会更加明了,但对于大大数,很大的数,reverse也增加了时间的开销。
char a[1000], //加数 b[1000], //加数 result[1001]; //和,预留一位 void LagerAdder() { bool c = false; int i = 0, temp, lena,lenb; cin >> a >> b; lena = strlen(a); lenb = strlen(b); i = lena>lenb?lena:lenb; while(lena >0 && lenb >0) { temp = a[lena-1] - 48 + b[lenb-1] - 48 + (c?1:0); result[i] = temp>=10? (temp%10+48):temp+48; c = temp>9?1:0; i--; lena--,lenb--; }// while while(lena>0) { temp = a[lena-1] -48 + (c?1:0); result[i] = temp>=10? (temp%10+48):temp+48; c = temp>9?1:0; i--; lena--; }// while while(lenb>0) { temp = b[lenb-1] -48 + (c?1:0); result[i] = temp>=10? (temp%10+48):temp+48; c = temp>9?1:0; i--; lenb--; }// while result[0] = (c?'1':'0'); //处理最高位,可能会有进位 char *p; p = (result[0]=='0')? //找寻到一个有效位 &(result[1]):&(result[0]); int len = strlen(p); cout << a ; cout << " + " ; cout << b; cout << " = "; cout << p << endl; }
不知道有没有看懂上面的文字?大满足一下,下面是添加reverse后的代码,感觉舒服很多,但是多了3个reverse!时间是O(n)。
char a[1000], //加数 b[1000], //加数 result[1001]; //和,预留一位 void reverse(char * c) { int len = strlen(c); for(int i=0; i<len/2; i++) swap(c[i],c[len-i-1]); } void hdu1002() { cin >> a >> b; bool c = false; int i = 0, ia = 0,ib = 0, temp, lena,lenb; lena = strlen(a), lenb = strlen(b); reverse(a); reverse(b); while(ia<lena && ib<lenb) { temp = a[ia] - 48 + b[ib] - 48 + (c?1:0); result[i] = temp>=10? (temp%10+48):temp+48; c = temp>9?1:0; i++; ia++,ib++; }// while while(ia<lena) { temp = a[ia] -48 + (c?1:0); result[i] = temp>=10? (temp%10+48):temp+48; c = temp>9?1:0; i++; ia++; }// while while(ib<lenb) { temp = b[ib] -48 + (c?1:0); result[i] = temp>=10? (temp%10+48):temp+48; c = temp>9?1:0; i++; ib++; }// while result[i] = (c?'1':'\0'); //‘\0’就是不做任何操作啦 reverse(result); reverse(a); reverse(b); cout << a << " + " << b << " = " << result << endl; }
本文完 2012-03-19
捣乱小子 http://blog.csdn.net/daoluanxiaozi