题目内容:已知q与n,求等比数列之和:1+q+q2+q3+q4+……+qn。
输入描述:输入数据不多于50对,每对数据含有一个整数n(1<=n<=20)、一个小数q(0<q<2)。
输出描述:对于每组数据n和q,计算其等比数列的和,精确到小数点后3位,每个计算结果应单独占一行。
题目分析:对于等比数列之和Sn=a1+a2+a3+……+an,有公式Sn=a1(1-qn)/(1-q) (q!=1)。本题要求的等比数列,实际上是有n+1项,且a1=1。
另外,求xy的函数是pow(x,y),他需要”#include<cmath>”。
本题要求控制小数点后的位数,如果采用C语言的printf函数来输出,那么控制小数点后的位数形式为”printf(“%*.*f”,a);”,如”printf(“%.3f\n”,sum);”。如果采用C++的cout输出,那么先用”cout.precision(n);”来设定小数点后保留n位,然后,输出时加”fixed”参数,表明是定点输出。
参考代码:
#include <vector>
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
struct Sum{int n;double q;};
int main(int argc,char * argv[])
{
vector<Sum> pair(50);
int num=0;
while(num<=49)
{
cin>>pair[num].n>>pair[num].q;
if(pair[num].n>=1&&pair[num].n<=20&&pair[num].n>0&&pair[num].q<2)
{
num++;
}
else if(pair[num].n<1||pair[num].n>20||pair[num].q<=0||pair[num].q>=2)
{
cout<<"The input is out of range";
}
if(cin.get()=='\n')
{
break;
}
}
cout.precision(3);
double sum;
for(int i=0;i<num;i++)
{
if(pair[i].q==1)sum=1+pair[i].n;
else
sum=(1-pow(pair[i].q,pair[i].n+1))/(1-pair[i].q);
cout<<fixed<<sum<<endl;
}
system("pause");
return 0;
}
效果如图: