关于这个练习6,虽然题量很大,有32道题,但好在大部分题目都很简单,部分题目略有难度,有些关于数列的题可以运用高中的数列公式无脑解决,而有的题则不能,还让我掌握了一种新的方法,让我很是惊喜。
1011(牛牛学数列)

题目描述

牛牛开始学习数列啦
现在他想知道1-2+3-4...+n的值

输入描述:

输入一个整数n (1≤n≤100)

输出描述:

输出一个整数
不难看出,相邻两个数(1-2,3-4,5-6,……)的和总是-1。所以,可以写出以下程序:
#include<iostream>
using namespace std;
int main()
{	
    int n;
    cin>>n;
    {
    if(n%2==0) cout<<(-1)*n/2;
    if(n%2!=0) cout<<((-1)*n/2)+n;
    }
    return 0;
}
但是,如果正常写程序,该怎么写呢?
#include<iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int sum = 0;
    for(int i = 1; i <= n; i++) {
        if(i % 2 == 0) {
            sum -= i;
        } else {
            sum += i;
        }
    }
    cout << sum << endl;
    return 0;
}
其实也可从另一个角度来看这道题:凡是减去的数,都是偶数,而凡是加上的数,都是奇数。所以,也可以以此为思路编写程序,并且可以更好地体现对循环的运用。
但对于1012(牛牛学数列2)来说,就没有规律可言了,这时,就得使用一个新方法了。

题目描述

这次牛牛又换了个数列,他想计算:1+1/2+1/3+…+1/N的值。(保留6位小数)

输入描述:

输入一个整数,范围在0到1000

输出描述:

输出一个浮点数
乍一看,这既不是等差数列,也不是等比数列,怎么办呢?其实,仔细观察,就会发现,数列的每一项分子都是1,分母都是后一项比前一项大1。这样,就可以应用新方法了:
#include <iostream>
using namespace std;
int main ()
{
	int i;
	double a[100],n,sum=0,q=1;
	scanf ("%lf",&n);
	for (i=1;i<=n;i++)
	{
	a[i]=1/q++;
	sum=sum+a[i];	
	}
	printf ("%.6f",sum);
}
其中,q(可看作公差)、计数器sum、循环条件中的n以及数组的数据类型都必须是double型,缺一不可。在之后的练习中,也多次以这道题为模板出题,所以这道题所运用的方法很重要,值得记忆。
再比如一些规律很复杂的数列,就不建议再用数学知识编写代码了,例如1010(输出奇偶数之和)

利用循环输出1∼n之间的所有奇数的和、偶数的和。

输入描述:

输入n。(1 ≤ n ≤ 10000)

输出描述:

输出为一行,两个数(用一个空格隔开),偶数之和与奇数之和

其实这道题也可看作奇数列求和与偶数列求和,所以可以这样写代码:
#include<iostream>
using namespace std;
int main()
{	
    int n;
    while(scanf("%d",&n)!=EOF)
    {
      if(n%2==0) cout<<((2+n)*n/2)/2<<" "<<((1+n-1)*n/2)/2<<endl;
      if(n%2!=0) cout<<((2+n)*n/2)/2<<" "<<((1+n)*(n/2+1))/2<<endl;
    }
    return 0;
}
显然这样不是很简便,难以理解。不如直接按照题目的意思写代码:
#include<iostream>
using namespace std;
int main() {
    int n,i;
    cin >> n;
    int odd = 0, even = 0;
    for(i = 1; i <= n; i++) 
    {
        if(i%2==0) 
        {
        even+=i;
        }else 
        {
        odd+=i;
        }
    }
    cout << even <<" "<< odd << endl;
    return 0;
}
这样写既简单又易于理解。
总结一下,就是这个练习6注重的是对思路的一个扩展和纠正,如果能坚持以循环的方法完成题目,必定会收获颇丰。