你的输入中间是逗号分隔,可是你的程序scanf是空格分隔,不匹配
不知道你这个问题是否已经解决, 如果还没有解决的话:本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+…
的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。输入格式: 输入在一行中给出一个正整数N。
输出格式: 在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例: 20 输出样例:
32.66
#include "stdio.h"
void beam()
{
int i,N,a;
double sum=0,m=2.0,n=1.0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
sum+=m/n;
a=m;//用a存储前一项的分子
m+=n;
n=a;//将前一项的分子赋给后一项的分母
}
printf("%.2f\n",sum);
}
int main()
{
beam();
return 0;
}
运行结果如下图:
该程序计算的是数列1/12 + 2/34 + 3/5*6 + ... + n/(2n-1)(2n),代码设计上没有明显的问题。
我们可以对照程序和题目,一步步检查答案是否正确,首先检查输入是否有误,如果输入的n小于等于0,程序会输出“输入错误!”,可以确认输入有误的情况已经得到处理。
进入循环之前,sum被初始化为0,如果n=1,则只计算一个数列项:1/12,结果为0.5。如果n=2,则计算两个数列项:1/12 + 2/3*4,结果为0.8333。分别手算一下,验证结果正确。
接下来将程序改为函数形式,便于以后调用。代码如下:
#include<stdio.h>
float CalcSeriesSum(int n)
{
int i=1, j=1;
float sum=0;
if(n<=0)
{
printf("输入错误!\n");
return 0;
}
while(i<=n)
{
sum+=((float)i)/(j*(j+1));
i++;
j+=2;
}
return sum;
}
int main()
{
int n;
float sum;
printf("请输入数列项数n: ");
scanf("%d", &n);
sum = CalcSeriesSum(n);
printf("数列前%d项和为: %.2f\n", n, sum);
return 0;
}
这个函数应该是完全正确的,可以放心使用。