关于这个练习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注重的是对思路的一个扩展和纠正,如果能坚持以循环的方法完成题目,必定会收获颇丰。

京公网安备 11010502036488号