| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2545 人关注过本帖, 1 人收藏
标题:跪求c算法,简单的公式。感谢大虾们。小弟没分,照顾下哈。
只看楼主 加入收藏
jiangwu10057
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:341
专家分:667
注 册:2009-3-25
收藏
得分:0 
找到原因了不会处理
原因是m太大了所以···
要对m和n进行约分
但是一开始m就太大了数值就有问题后面的约分也就不可能实现
现在想办法中···
···无语了以前写的阶乘也出问题 了···


[ 本帖最后由 jiangwu10057 于 2009-10-24 17:00 编辑 ]
2009-10-24 16:44
海神之剑
Rank: 1
等 级:新手上路
帖 子:16
专家分:9
注 册:2009-10-22
收藏
得分:0 
我觉得没那么复杂
只需下面这样处理一下
for(i=1;i<=n;i++)
a+=(1/i)*(-1)^(i-1);
2009-10-24 17:15
山区
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2009-10-27
收藏
得分:0 
/*
日期:2009年10月26日
 
题目:要求用户输入 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("sum = 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);     //输出计算结果。
}




已经在VC上运行通过。
第一次在这里发帖,希望能帮到你的忙。同时也希望得到高手指教。
2009-10-27 00:29
山区
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2009-10-27
收藏
得分:0 
回复 10楼 dengjun000
都加起来再减去,这样的方法不太好。如果能找到规律,就直接实现最好。
2009-10-27 01:43
山区
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2009-10-27
收藏
得分:0 
回复 17楼 LEED
m=p/(t+1);

两边的类型不匹配,一定要匹配才行。
可以为:
m = (float)p/(t+1);

这样就得到一个不同的结果,不再可能老得到1。
但你的算法不能解决楼主的问题。如果有需要就看看我的解法吧。
2009-10-27 02:03
baidu0088
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-10-26
收藏
得分:0 
以下是引用山区在2009-10-27 00:29:44的发言:

/*
日期:2009年10月26日
 
题目:要求用户输入 n 的值,算出总和 sum。公式如下:
      sum = 1 - 1/2 + 1/3 + 1/4 - 1/5 + 1/6 + 1/7 + 1/8 - 1/9 + ... 1/n
 
程序分析:主要是看分母,分母是自然数。再看各 ...
强~~~~~
2009-10-27 12:37
wbq30747
Rank: 1
等 级:新手上路
帖 子:14
专家分:4
注 册:2009-10-21
收藏
得分:0 
隔几天回来,看到还是有人回帖,小弟在此感谢,感谢大家的帮助,谢谢。
2009-10-28 17:59
忆水流年
Rank: 1
等 级:新手上路
帖 子:12
专家分:2
注 册:2009-9-17
收藏
得分:0 
4楼正解
2009-10-28 19:51
山区
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2009-10-27
收藏
得分:0 
/*
日期: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上运行通过,如果需求的不一样,就在一些地方修改一下吧。
对了,你的问题解决没有呀??没有见你回音的。
2009-10-29 08:50
山区
Rank: 1
等 级:新手上路
帖 子:16
专家分:3
注 册:2009-10-27
收藏
得分:0 
以下是引用忆水流年在2009-10-28 19:51:29的发言:

4楼正解
4楼的解法是好的,但跟楼主的要求不付呀。注意为负数的数是哪些数。
2009-10-29 09:00
快速回复:跪求c算法,简单的公式。感谢大虾们。小弟没分,照顾下哈。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019180 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved