新知识
例1.计算数列前N位的和
写程序求以上数列前N位的和,(N>0且N<1000)。例如:输入2,输出5;输入6,输出28。
(1)题目分析
通过题目要求,解题过程可以分为三个步骤。
- 计算新的插入值
- 前面两项的乘积会出现两位数,要把两位数分割出十位和个位上的数字。
- 新数字如何存储到数列。
步骤1:计算新的插入值
第i位上数字等于前两位数值上的积。我们利用数组存储数列,这样求值就很简单了。
//定义一个数组存储数字
int buf[1000];
buf[0] = 2;
buf[1] = 3;
...    
int v = buf[i-1] * buf[i-2];
步骤2:分割数字
利用取模(%)和整除(/)运算符分割十位和个位。
//v为前两项乘积
if(v>9){
	int v1 = v/10; //v1是十位上数字
	int v2 = v%10; //v2是个位上数字
}
步骤3:存储数字
//前两位是2和3
buf[0] = 2;
buf[1] = 3;
//索引值,指向下一个位置
int i = 2;
if(v>9){
	//两位数存储
	...
	buf[i++] = v1;
	buf[i++] = v2;
}
else{
	//一位数存储
	buf[i++] = v;
}
完整代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int buf[1000],N;
	buf[0] = 2;
	buf[1] = 3;
	
	int i=2;
	
	cin>>N;
	
	while(i<N){
	
		int v = buf[i-1] * buf[i-2];
				
		if(v>9){
			int v1 = v/10;
			int v2 = v%10;
			buf[i++] = v1;
			buf[i++] = v2;
		}
		else{
			buf[i++] = v;
		}
	}
	
	int sum = 0;
	for(i=0;i<N;i++){
		sum+=buf[i];
	}
	
	cout<<sum;
	return 0;
}
    
        思考:上面程序先算好前N位数字,再进行求和。进行了N*2次循环。能否修改程序,减少循环次数。