打不了弟批


私信TA

用户名:WDMoonMoonBird

访问量:37178

签 名:

不想当书法家的程序员不是好厨子

等  级
排  名 28
经  验 15551
参赛次数 122
文章发表 77
年  龄 24
在职情况 教师
学  校 南宁师范大学
专  业 计算机科学与技术

  自我简介:

我爱学习

解法一:循环累加

将输入的数字N循环逐次减1,定义一个变量sum将每次减1的结果累加,输出sum就是所求结果

#include <iostream>
using namespace std;
int main() {
    int N,sum = 0;
    cin >> N;
    for (int i = 1; i <= N; ++i) {
        sum += i;
    }
    cout << sum << endl;
    return 0;
}

解法二:高斯的加法

假如给定的N=10,则这种算法是1+10、2+9、3+8、4+7、5+6,然后会发现,前面这几个加法算式的结果都是11,如下图所示

图片1.png

这个时候,只需要11*5,就可以得出结果。11*5不是固定值,是根据N得来的,所以我们得出sum = (1+N)*N/2。但是这里要注意,假如N是奇数,如果纯粹按照公式,我们会忽略掉最中间的值,所以要特殊处理一下,sum要加上(N/2)+1才是正确结果。

#include <iostream>
using namespace std;
int main() {
    int N,sum = 0,ans;
    cin >> N;
    ans = 1 + N;
    sum = N / 2 * ans;
    if (N % 2 != 0) sum += (N / 2 + 1);//判断N的奇偶性
    cout << sum << endl;
    return 0;
}

解法三:等差数列求和公式

还是高斯,他老人家总结出了一条等差数列求和公式:

u=2838679063,299287394&fm=58.png

公式描述:公式中首项为a1,末项为an,项数为n,公差为d,前n项和为Sn。

根据题意,再套用公式,在本题中我们可以得出首项为1,末项为N,公差为1,有了公式就很好写代码了,这就是数学的魅力

#include <iostream>
using namespace std;
int main() {
    int N;
    cin >> N;
    int sum = N * 1 + (N * (N - 1)) / 2 * 1;
    cout << sum << endl;
    return 0;
}


 

0.0分

11 人评分

  评论区

#include<stdio.h>
int main()
{
int sum,i,n;
sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=i;
}
printf("%d以内累加之和为%d",n,sum);
}
2023-02-01 20:27:38
1
2021-06-05 17:24:39
1
2021-06-05 17:24:19
  • «
  • 1
  • »