题目:
使用求和公式求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];
}
}