使用求和公式求1到N的累加和大家都会,但是如果把N值变大呢,比如100位的整数,那该怎么求?
输入格式:
输入在一行中给出1个位数不超过100位的整数N。
输出格式:
对每一组输入,在一行中输出1+2+3+……+N的值。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
55
思路: 题目本质上需要使用等差数列求和公式,即:Sn=n(a1+an)/2
由题可知,a1 = 1,an = N,因此只需要求N(N + 1)/2的值即可
代码:
#include <bits/stdc++.h>
using namespace std;
int a[105], b[105], c[10005], d[10005];
int main(){
string s;
cin >> s;
int len1 = s.length();//整数N的长度
for(int i = 0; i < len1; i++){
a[len1 - i] = s[i] - '0';
b[len1 - i] = s[i] - '0';
}
//求整数N+1
b[1] += 1;
int index = 1;
while(b[index] == 10){
b[index] = 0;
b[++index] += 1;
}
int len2 = max(index, len1), adv = 0;//整数N+1的长度,每次运算的进位
//高精度乘法
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
c[i + j - 1] += a[i] * b[j] + adv;//当前位的值等于当前位本身+当前乘积+上次乘积的进位
adv = c[i + j - 1] / 10;//求进位
c[i + j - 1] %= 10;//求余取当前位
}
c[i + len2] = adv;
adv = 0;
}
int len3;//N(N+1)的长度
for(int i = 10004; i >= 1; i--){
if(c[i] != 0){
len3 = i;
break;
}
}
//求高精度数除2的值
int t = 0;
for(int i = len3; i >= 1; i--){
t += c[i];
d[i] = t / 2;
t = 10 * (c[i] % 2);//保留余数
}
int len4 = len3;//最终计算结果的位数
if(d[len3] == 0) len4--;//若第一位为0则计算结果的位数减一
for(int i = len4; i >= 1; i--){
cout << d[i];
}
return 0;
}