要不是这几天偶然翻看自己的答题记录,我差点忘记自己最最最基础的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的联动很方便,但是这种方便需要你打个心眼才可以使用。