对于输入的两个不超过100位数字的非负整数,给出两数之和。
输入格式:
在两行中分别给出两个不超过100位数字的非负整数
输出格式:
在一行中输出两数之和
123
12
输出样例:
135
高精度加法,顾名思义,就是位数很多的两个数相加。
既然位数很多,就不能用longlong来存储了!
应该先输入字符串,再把字符串转化为数字,放在数组之中。
这个过程交给一个函数完成,就叫这个函数cinit();
之后再 定义两个string(当然要先引入头文件)ac,bc;
之后,再定义两个整形数组,来把数一位一位的储存起来。
先让定义的两个数组各项为0
之后,还要记录位数,所以把这两个整形
长这样子:
void cinit()
{
cin >> ac >> bc;
a[0] = ac.size();
b[0] = bc.size();
for (int i = 1; i <= a[0]; i += 1)
{
a[i] = ac[a[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
for (int i = 1; i <= b[0]; i += 1)
{
b[i] = bc[c[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
}
之后,再进行一位一位的相加,同时注意进位。
其实进位问题很好处理,只需要和10比较。
同时建立一个数组,来进行存储相加之后的结果。
不过注意,这个数组的位数可能是比a和b这两个数组中最大的多1的,因为有进位的情况
一位一位相加的过程交给work()实现:
void work()
{
c[0] = (a[0] > b[0]) ? a[0] : b[0];
for (int i = 1; i <= c[0]; i += 1)
{
c[i] = a[i] + b[i];
if (c[i] >= 10)
{
c[i] %= 10;
c[i + 1] += 1;
}
}
}
之后,就在将刚刚用于存储结果的数列进行倒叙输出,不过注意前导0的问题,也即是输出的第一项不可以为0;
这个交给coutit()来实现:
void coutit()
{
if (c[c[0] + 1] != 0)
{
cout << c[c[0] + 1];
}
for (int i = c[0]; i > 1; i -= 1)
{
cout << c[i];
}
}
最后就是这样子啦!
#include <iostream>
#include <string>
using namespace std;
int a[201];
int b[201];
int c[201];
string ac, bc;
void cinit();
void work();
void coutit();
int main()
{
for (int& x : a)
{
x = 0;
}
for (int& x : b)
{
x = 0;
}
for (int& x : c)
{
x = 0;
}
cinit();
work();
coutit();
return 0;
}
void cinit()
{
cin >> ac >> bc;
a[0] = ac.size();
b[0] = bc.size();
for (int i = 1; i <= a[0]; i += 1)
{
a[i] = ac[a[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
for (int i = 1; i <= b[0]; i += 1)
{
b[i] = bc[b[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
}
void work()
{
c[0] = (a[0] > b[0]) ? a[0] : b[0];
for (int i = 1; i <= c[0]; i += 1)
{
c[i] += a[i] + b[i];
if (c[i] >= 10)
{
c[i] %= 10;
c[i + 1] += 1;
}
}
}
void coutit()
{
if (c[c[0] + 1] != 0)
{
cout << c[c[0] + 1];
}
for (int i = c[0]; i >= 1; i -= 1)
{
cout << c[i];
}
}
题目:
使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?
输入格式:
输入在一行中给出1个位数不超过100位的整数N。
输出格式:
对每一组输入,在一行中输出1+2+3+……+N的值。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
55
短小而精悍
关键在于高精度。
但是,在这刚到ACM的一周里面,我学到了一件事,那就是不能与题目硬碰硬,应该学会化解题目。
这里显然不能从一一直加到所给的高精度数
因为时间太长了。
所以说应该用其他的方法去求 。
编程的思路常常需要数学思想的介入,其实当我们用数学的眼光去看这个问题的时候,会发现这不就是等差数列前项和吗?
所以说,如所给的高精度数是a的话,那么答案就是
a*(a+1)/2
那么下面分别用函数来实现a+1、a*(a+1)、/2
(当然,高精度的思想还是要一直存在的)
a+1:
void jiayi()
{
for (int i = 0; i <= a[0]; i += 1)
{
b[i] = a[i];
}
b[1] += 1;
for (int i = 1; i <= a[0]; i += 1)
{
if (b[i] > 9)
{
b[i] -= 10;
b[i + 1] += 1;
}
else
{
break;
}
}
if (b[a[0]] != a[a[0]])
{
b[0] += 1;
}
}
a*(a+1):
void cheng()
{
for (int& x : c)
{
x = 0;
}
for (int i = 1; i <= a[0]; i += 1)
{
for (int x = 1; x <= b[0]; x += 1)
{
c[i + x - 1] += a[i] * b[x];
if (c[i + x - 1] >= 10)
{
c[i + x] += c[i + x - 1] / 10;
c[i + x - 1] = c[i + x - 1] % 10;
}
}
}
if (c[a[0] + a[0]] != 0)
{
sizec = a[0] + b[0];
}
else
{
sizec = a[0] + b[0] - 1;
}
c[0] = sizec;
}
/2:
void chu()
{
int cc[300];
cc[0] = c[0];
for (int i = 1; i <= cc[0]; i += 1)
{
cc[i] = c[cc[0] + 1 - i];
}
int temp = 0;
for (int i = 1; i <= cc[0]; i += 1)
{
d[i] = (cc[i] + temp * 10) / 2;
temp = (cc[i] + temp * 10) % 2;
}
}
我是把这几步结果放在一个新的数组中的,这样子可以便于处理。
#include <iostream>
#include <string>
// 用高斯加法
// 也就是等差数列求和
// 首项是1,末项是shu
// (shu*(shu+1))/2;
using namespace std;
string s;
void cinit();
int a[300];// 用来存储cinit之后的结果
void jiayi();
int b[300];// 同上
void cheng();
int c[300];
int sizec = 0;
void chu();
int d[300];
void coutit();
int main()
{
cinit();
jiayi();
cheng();
chu();
coutit();
return 0;
}
void cinit()
{
cin >> s;
a[0] = s.size();
for (int i = 1; i <= a[0]; i += 1)
{
a[i] = s[a[0] - i] - '0';
}
}
void jiayi()
{
for (int i = 0; i <= a[0]; i += 1)
{
b[i] = a[i];
}
b[1] += 1;
for (int i = 1; i <= a[0]; i += 1)
{
if (b[i] > 9)
{
b[i] -= 10;
b[i + 1] += 1;
}
else
{
break;
}
}
if (b[a[0]] != a[a[0]])
{
b[0] += 1;
}
}
void cheng()
{
for (int& x : c)
{
x = 0;
}
for (int i = 1; i <= a[0]; i += 1)
{
for (int x = 1; x <= b[0]; x += 1)
{
c[i + x - 1] += a[i] * b[x];
if (c[i + x - 1] >= 10)
{
c[i + x] += c[i + x - 1] / 10;
c[i + x - 1] = c[i + x - 1] % 10;
}
}
}
if (c[a[0] + a[0]] != 0)
{
sizec = a[0] + b[0];
}
else
{
sizec = a[0] + b[0] - 1;
}
c[0] = sizec;
}
void chu()
{
int cc[300];
cc[0] = c[0];
for (int i = 1; i <= cc[0]; i += 1)
{
cc[i] = c[cc[0] + 1 - i];
}
int temp = 0;
for (int i = 1; i <= cc[0]; i += 1)
{
d[i] = (cc[i] + temp * 10) / 2;
temp = (cc[i] + temp * 10) % 2;
}
}
void coutit()
{
if (d[1] != 0)
{
cout << d[1];
}
for (int i = 2; i <= c[0]; i += 1)
{
cout << d[i];
}
}