/*
日期:2009年10月28日
题目:要求用户输入 n 的值,算出总和 sum。公式如下:
sum = 1 - 1/2 + 1/3 + 1/4 - 1/5 + 1/6 + 1/7 + 1/8 - 1/9 + ... 1/n
程序分析:主要是看分母,分母是自然数。再看各数的符号,为负的时候是(k=)2、5、9、14……,
可以看出他们最近的两个数之间的差为(m=)3、4、5 ……
*/
#include<stdio.h>
void main()
{
int k=2; //变量 k 表示这个数为负数时的分母。
int m=3; //变量 m 表示最近两个为负数的数的分母之间的差。
int n=0; //需要用户输入的数。
int i=0; //循环变量。
float sum=1.0; //计算公式的结果。
printf("请输入任意一个整数:\n");
scanf("%d", &n); //从屏幕接收用户输入的数值。
printf("\nsum = 1"); //先显示开头部分。
for(i=2; i<=n; i++)
{
if(i == k) //比较自变量 i 与 k 是否相等,相等就认为这个数是负数。
{
sum = sum - 1/(float)i; //强制转换 i 为 float,这样相除之后才得到小数。
k = k + m; //让 k 表示下一个负数的分母。
m++; //负数的分母之间的差是一个从 3 开始的自然数。
printf(" - 1/%d", i); //显示为负数的数。
}
else //不相等就认为这个数是正数。
{
sum = sum + 1/(float)i;
printf(" + 1/%d", i); //显示为正数的数。
}
}
printf("\nsum = %f\n", sum); //输出计算结果。
//当 x、y 的类型为 long 时,n 的值只能取小于等于12,大于12后的 x 、y 就不准确了。
//当 x、y 的类型为 double 时,n 的值只能取小于等于170,大于170后的 x 、y 就不准确了。
//出现这样的原因有:1、在计算机中类型所能表示的数是有限的。
// 2、对分母 y 没有求最小公倍数,也没有对 x、y 进行约分。
k = 2;
m = 3;
long x=1; //用来存放分子。
long y=1; //用来存放分母。
//printf("please input a number:\n");
//scanf("%d", &n);
printf("\n\nsum = 1");
if(n >= 2) //从第二位开始。
{
for(i=2; i<=n; i++)
{
if(i == k)
{
printf(" - 1/%d", i);
x = x * i - y; //进行公倍数后求得分子。
y = y * i; //分母直接求它们之间的乘积,没有求最小公倍数。需要的话加个判断就行。
k = k + m;
m++;
}
else
{
printf(" + 1/%d", i);
x = x * i + y;
y = y * i;
}
}
printf("\nsum = %ld/%ld", x, y);
}
printf("\nsum = %f\n\n", (float)x/y); //为了跟前面求得的结果进行比较,相等说明算法没错。
}
再来一帖,看看是否达到你的要求。
本程序已经在VC上运行通过,如果需求的不一样,就在一些地方修改一下吧。
对了,你的问题解决没有呀??没有见你回音的。