华师一附中OI组
标题:
二阶等差数列求和
[打印本页]
作者:
admin
时间:
2018-4-11 12:20
标题:
二阶等差数列求和
这个题要认真的思考,锻炼逻辑思维,可以让我们的代码变得艺术。
原题求 S=1+2+4+7+****+N
1、N是第x个数
2、N是小于x的最大整数
3、N是大于x的最小整数
输入x,求s。
作者:
admin
时间:
2018-4-30 17:34
先做第一问吧,首项可以设为0或者1,我一般喜欢设置为0,这样可以适合更大情况,比如N是小于1的最大整数,那就是没有!
找规律:
用i表示目前是第几项,a表示这项的值,s表示总和,那么:
i a s
0 0 0
1 1 1
2 2 3
3 4 7
4 7 14
5 11 25
6 16 41
我们假设按照i,a,s的顺序变化,这个也很重要,顺序不一样,结果也会不一样,我一般喜欢直观的变化,i的变化引起a的变化,然后引起s的变化
s=a=0;
for (i=1;i<=10;i++)
{a=a+i-1; 第i项比前一项大i-1
s=s+a;
cout<<a<<s<<endl; 这里检查下中间结果
}
cout<<s;这个执行的顺序是i变化,判断i是否符合条件,求a,求s,i变化,判断,在求a,求s
但是第2问,是判断a,所以要改动一点
作者:
admin
时间:
2018-5-4 19:17
另外一个做法。N是小于x的最大整数,那么意思就是说 while(N<x)就做,按照这个条件,我们来拼出程序
while (N<x)
{
循环体里面应该有三句话,因为有三个变化的,s,n,i 这个经验很重要!!!
}
把 n=n+i,放在最后面,先加,再判断,然后求和 (注意这个顺序!!!)
写成
while (N<x)
{s=s+N;l
N=N+i;
i++;
}
再拼凑初始值
显然 s=0;
N=1l;
i=1;
所以最后答案
#include <iostream>
using namespace std;
int s,N,i,x;
int main()
{
cin>>x;
s=0;N=1;i=1;
while (N<x)
{
s=s+N;
N=N+i;
i++;
}
cout<<s;
return 0;
}
复制代码
作者:
徐翊凯
时间:
2018-5-4 19:38
#include<iostream>
using namespace std;
int s,N,i,x;
int main()
{
cin>>x;
s=0;
N=1;
i=1;
while (N<=x)
{
s=s+N;
N=N+i;
i++;
}
s=s+N;
N=N+i;
i++;
cout<<s;
return 0;
}
作者:
admin
时间:
2018-5-4 19:51
上面徐同学的做法很好理解,N<=x就加,那么>x的时候就退出了循环,这个时候再加上N就行了。可是后面的N=N+i;i++就画蛇添足了。
作者:
admin
时间:
2018-5-4 19:51
上面徐同学的做法很好理解,N<=x就加,那么>x的时候就退出了循环,这个时候再加上N就行了。可是后面的N=N+i;i++就画蛇添足了。
作者:
黄昌泰
时间:
2018-5-4 19:53
提示:
作者被禁止或删除 内容自动屏蔽
作者:
admin
时间:
2018-5-4 19:54
其实第三问,我们只要调整一下第二问的解法中,循环里面的语句的顺序就差不多了,我们把N=N+i放在s=s+N的前面,这样当n>x的时候就会把这个N加到s里面去,为了配合这个做法,前面s,N,i的初始值要作相应的改变。
作者:
胡炜尧
时间:
2018-5-4 20:01
提示:
作者被禁止或删除 内容自动屏蔽
作者:
尹泽源
时间:
2018-5-4 20:59
提示:
作者被禁止或删除 内容自动屏蔽
作者:
GTR
时间:
2018-5-4 22:50
第三问
#include <iostream>
using namespace std;
int s,N,i,x;
int main()
{
cin>>x;
s=0;N=0;i=0;
while (N<x)
{
N=N+i;
s=s+N;
i++;
}
N=N+i;
s=s+N;
i++;
cout<<s;
return 0;
}
复制代码
作者:
admin
时间:
2018-5-5 15:06
很好 ,大家就像这样的 ,每个题目我们都认真做,多种做法,这样对C++的语法和基本思想就更熟练了
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2