北大ACM1001心得(1)——大数加法

来源:互联网 发布:淘宝客推广收费吗 编辑:程序博客网 时间:2024/06/03 09:07

要不是这几天偶然翻看自己的答题记录,我差点忘记自己最最最基础的1001竟然忘记做了,实在是罪过罪过。于是花了些时间把这道题解了。效率时间都还不错。

博主写代码有个习惯,就是喜欢吧代码写的特别详细,生怕别人看不懂。事实上,我个人觉得,精简代码固然好,既可以有效缩减代码长度,而且效率甚至可能比那些大段大段的代码片段更好。但是,在学习阶段,我觉得最重要的还是最好多用,多想,多思考,多学习学习C++中各种代码的运用。所以我的代码都挺长的,只不过我相信我的代码绝对是挺好理解,而且很方便修改的。

北大ACM的题库很有意思,1000题可以说只要对编程有所了解,都可以做出来,可是1001、1002紧接着的这2道题实在是让人很蛋疼。主要是放在基础部分,我觉得难度或者考察的思想和内容已经在2000难度左右了,我想ACM题库让人望而却步的主要还是这两道题,可怕的30左右的通过率,实在是让人忘却了继续做下去的意愿。

这里博主花了一天的时间,深挖了一下ACM1001的一些内在内容,组成好几篇心得,今天是其中的一篇大数加法。

大数加法可以说是一切数据运算的基础。乘法实在加法的基础上得到的。所以大数加法是任何靠校的良好途径。不仅仅包括十进制大数加法,还可以有各种进制,但是只要弄清楚其中的内在联系。可以说任何进制都是手到擒来。

下面贴的大数加法代码从最最最基础的运算角度出发,为诸位提供了一块砖头。代码如下已经做了必要的注解

//大数加法,乘法的基础,设计思路和普通加法一致,但要注意高位进位的问题,通过addflag可以较为轻松的解决char* addbig(string a, string b){string start("0");int m = a.length();int n = b.length();string c;int temp;if (m < n){c = a;a = b;b = c;temp = m;m = n;n = temp;}//保证a中的一定是位数最长的数值a = start + a;int i, j = 0;int addflag = 0;char *res = new char[m + 2];res[m + 1] = '\0';for (i = m, j = n - 1; i >= 0; i--){if (j < 0) temp = (a[i] - 48) + addflag;else temp = ((a[i] - 48) + (b[j] - 48)) + addflag;  //进行加法运算,由于加法的特性,//由于9+9 = 18,所以你进位最高为1,不必像大数乘法考虑那么多addflag = temp / 10;res[i] = temp % 10 + 48;j--;}if (res[0] == 48){for (i = 0; i < m; i++){res[i] = res[i + 1];}res[i] = '\0';}//进行必要的检查,删去不必要的位置,避免浪费空间。return res;delete[]res;res = NULL;}
int main(){char a[10];char b[10];cin >> a >> b;char *c;c = addbig(a, b);cout << c;system("pause");return 0;}



这里如果你理解了之后,可以把其中的一些表示进制的量换成其他进制,就可以很方便的得到各种进制的大数加法。这里博主就不贴代码了。

还有就是C++中string 和 char* 互相联动很方便,但是切记,char*最终要的是终止符的定义,否则会出现意外情况。诸位看下面的测试代码

#include<iostream>#include<string>using namespace std;int main(){char *a = "Hello";char *b = new char[10];for (int i = 0; i < 5; i++){b[i] = 'a';}string str1 = a;string str2 = b;cout << "a length" << str1.length() << endl;cout << "b length" << str2.length() << endl;system("pause");return 0;}
很多人喜欢才用b[i]这种赋值方式,以为系统在处理时会想a一样自动加上‘\0’,事实上并不会,然后再传递时就会出大问题。

在这里必须加上

b[5] = '\0';
才可以正常得到结果,所以诸位使用的同学要注意了,虽然char*,string的联动很方便,但是这种方便需要你打个心眼才可以使用。




原创粉丝点击