/*
日期: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上运行通过,如果需求的不一样,就在一些地方修改一下吧。
对了,你的问题解决没有呀??没有见你回音的。