关于这个练习6,虽然题量很大,有32道题,但好在大部分题目都很简单,部分题目略有难度,有些关于数列的题可以运用高中的数列公式无脑解决,而有的题则不能,还让我掌握了一种新的方法,让我很是惊喜。
1011(牛牛学数列)
题目描述
牛牛开始学习数列啦
现在他想知道1-2+3-4...+n的值
输入描述:
输入一个整数n (1≤n≤100)
输出描述:
输出一个整数
#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
输出描述:
输出一个浮点数
#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注重的是对思路的一个扩展和纠正,如果能坚持以循环的方法完成题目,必定会收获颇丰。