新知识
例1.计算数列前N位的和
写程序求以上数列前N位的和,(N>0且N<1000)。例如:输入2,输出5;输入6,输出28。
(1)题目分析
通过题目要求,解题过程可以分为三个步骤。
- 计算第N位上的数值
- 前面两项的乘积会出现两位数,要把两位数分割出十位和个位上的数字。
- 新数字如何存储到数列。
步骤1:计算N位上的数值
第N位上数字等于前两位数值上的积。我们利用数组存储数列,这样求值就很简单了。
//定义一个数组存储数字
int buf[1000];
buf[0] = 2;
buf[1] = 3;
...
int v = buf[N-1] * buf[N-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(n=0;n<N;n++){
sum+=buf[n];
}
cout<<sum;
return 0;
}
思考:上面程序先算好前N位数字,再进行求和。进行了N*2次循环。能否修改程序,减少循环次数。