这个题考察的也是基础的算法--模拟,一般在竞赛中这种算法是算是最简单的了,通俗的讲就是不需要任何硬性的要求,就是照葫芦画瓢,按照题中给我们的要求进行完成。
首先我们看这道题的测试数据的要求的大小是远远超过long long类型 ,所以我们也不能简单的直接就是用longlong类型的两个变量直接相加就输出了,这样做的话你只会得到40分,如果我们想要拿到满分的话,我们可以采用数组的思想解决这一道题。
1.首先我们需要定义数组(这里我自己定义的是3个数组):
int a[1000001], b[1000001], c[1000001], j;
char s[1000001], ss[1000001];
这里我定义的是5个数组,也可以按照别的方法进行定义(但是需要注意的是我们需要对这几个数组进行初始化-----这里我们用的是memset函数<自己不是很熟悉的去自己去查一下>)
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c)); // 初始化
然后我们的开始接受输入这里我们接受是字符串类型的---注意
我这里让a和b这两个数组的第一个元素都储存的是两个相加的长度---a[0], b[0]
a[0] = strlen(s);
b[0] = strlen(ss); // 获取长度
然后我们需要对其接受的字符数组的每一元素进行转化(每一个元素ASCII码减去'0'的)
而且这里我们需要转换变量的顺序(因为我们是从个位进行操作)
for(int i = 1; i <= a[0]; i++) a[i] = s[a[0] - i] - '0'; // 转化成数字
for(int i = 1; i <= b[0]; i++) b[i] = ss[b[0] - i] - '0';
接下来我们开始相加
for(j = 1; j <= max(a[0], b[0]) + 1; j++)
{
c[j] = a[j] + b[j];
if(c[j] >= 10)
{
c[j] %= 10;
a[j + 1]++;
}
}
这里的重点是----加一当两个数的最高位都相同有可能会进一,所以这里会有一个进一,但后我是把相加后数字转换到了c数组中。
最后就是输出了,这里我们遇到的了最后一个问题就是怎样确定相加后的数的最高位(然后我自己利用的是使用两个限制它)
c[0] = j;
if(c[j + 1] > 0) c[0]++; // 感觉没有必要
for(int i = c[0]; i >= 1; i--)
{
if(x == false && c[i] == 0) continue; // 一重保险
x = true;
cout << c[i];
}
这里我们有一个额定的判位(但是我自己感觉没有啥必要, 因为进完位最高就是 j )
这里我们使用一个bool判断最高位 一旦第一个不为零的数出现了以后,后面这个判断就都不会成立了
最后的代码贴上来:
#include <bits/stdc++.h>
using namespace std;
int a[1000001], b[1000001], c[1000001], j;
char s[1000001], ss[1000001];
bool x = false;
int main()
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c)); // 初始化
scanf("%s%s", s, ss); // 读入两个数;
a[0] = strlen(s);
b[0] = strlen(ss); // 获取长度
for(int i = 1; i <= a[0]; i++) a[i] = s[a[0] - i] - '0'; // 转化成数字
for(int i = 1; i <= b[0]; i++) b[i] = ss[b[0] - i] - '0';
for(j = 1; j <= max(a[0], b[0]) + 1; j++)
{
c[j] = a[j] + b[j];
if(c[j] >= 10)
{
c[j] %= 10;
a[j + 1]++;
}
}
c[0] = j;
if(c[j + 1] > 0) c[0]++; // 感觉没有必要
for(int i = c[0]; i >= 1; i--)
{
if(x == false && c[i] == 0) continue; // 一重保险
x = true;
cout << c[i];
}
if (x == false) cout << 0; // 二重保险
cout << endl;
system("pause");
return 0;
}