论坛: 编程破解 标题: 是我晕了还是程序错了[C语言] 复制本贴地址    
作者: mars_bys [mars_bys]    论坛用户   登录
求N的阶乘![N!]在和大于是1000时跳出!
程序如下↓
MAIN()
{
int p, i=1, n, s=0;
  while(s<=1000)
{
    p=1;
    for(n=1;n<=i;i++)
{
    p=p*n;
    n=n+1;
    s=s+p;
  }
  }
      printf("%d"s);
  }
    }
  在程序上应该有逻辑上的错误!


[此贴被 迎月默想(mars_bys) 在 08月14日20时45分 编辑过]


[此贴被 迎月默想(mars_bys) 在 08月14日20时48分 编辑过]

地主 发表时间: 04-08-13 21:52

回复: bug_me [bug_me]   论坛用户   登录
main()
{  int n=1,s=1;
    while(s<=1000)
    {
      n++;
      s=s*n;
    }
    printf("%d",s/n);
}




[此贴被 寒枫(bug_me) 在 08月14日23时21分 编辑过]

B1层 发表时间: 04-08-14 03:33

回复: lida1818 [lida1818]   论坛用户   登录
借楼上的程序一用

main()
{  int n=1,s=1;
    while(s<=1000)
    {
      n++;
      s=s*n;
    }
    printf("%d",s/n);
}

B2层 发表时间: 04-08-14 09:53

回复: mars_bys [mars_bys]   论坛用户   登录
楼上的。先谢过你的回复,但你哪个程序是求和大于1000跳出。我的意思是求N的阶乘。。。

B3层 发表时间: 04-08-14 20:12

回复: bug_me [bug_me]   论坛用户   登录
TO烟雨:谢了,我的臭毛病

TO楼主,不明白你啥意思


[此贴被 寒枫(bug_me) 在 08月14日21时02分 编辑过]

B4层 发表时间: 04-08-14 21:02

回复: mars_bys [mars_bys]   论坛用户   登录
N的阶段乘就是1!+2!+3!。。。。。。+N!
2!=1*1*2 3!=1*1*2*3

B5层 发表时间: 04-08-14 21:51

回复: lida1818 [lida1818]   论坛用户   登录
相信你在签名里说的是真事。

B6层 发表时间: 04-08-14 21:58

回复: bug_me [bug_me]   论坛用户   登录

/*实现阶乘小于1000的最大输出*/
main()
{  int n=1,s=1;
    while(s<=1000)
    {
      n++;
      s=s*n;
    }
    printf("%d",s/n);
}

/*实现SUM小于1000的阶乘和*/
main()
{
  int n=1,s=0,t=1;
  while(s<1000)
  {
    t*=n;
    s+=t;
    n++;
  }
  printf("%d",s-t);
  getch();
}

自己看看有什么不同吧,注释就不加了


[此贴被 寒枫(bug_me) 在 08月14日23时27分 编辑过]

B7层 发表时间: 04-08-14 22:22

回复: lida1818 [lida1818]   论坛用户   登录
我说的是楼主的签名。

B8层 发表时间: 04-08-14 22:25

回复: mars_bys [mars_bys]   论坛用户   登录
我哪里错了吗?

B9层 发表时间: 04-08-14 22:44

回复: xuwudi2004 [xuwudi2004]   论坛用户   登录
1000!>>32767
有可能就是这个原因~!

B10层 发表时间: 04-08-15 08:34

回复: zzxzzx [zzxzzx]   论坛用户   登录
MAIN()
{
int p, i=1, n, s=0;
  while(s<=1000)
{
    p=1;
    for(n=1;n<=i;i++)//本来应该是n++,不过你的i=1,因此也循环不了.// 
{
    p=p*n;
    n=n+1;
    s=s+p;
  }
  }
      printf("%d"s);
  }
    }


B11层 发表时间: 04-08-15 09:19

回复: mars_bys [mars_bys]   论坛用户   登录
这个题是书上的例题。我觉得它有问题,所以过来请教的。


B12层 发表时间: 04-08-16 16:05

回复: mars_bys [mars_bys]   论坛用户   登录
还有就是。以上枫给的程序是一直累加直到大于是1000跳出。题目的要求不是这个。

B13层 发表时间: 04-08-16 16:06

回复: Garu [syshunter]   版主   登录
那你就 while(n<=1000) {s=s*n; n++; } 就是了

B14层 发表时间: 04-08-16 19:24

回复: lida1818 [lida1818]   论坛用户   登录
TO:Garu

你这样行得通吗?

1000!是多大的数?

TO:楼主

问问题,不是猜迷。
说清楚题意,从你顶楼开始看到最后我是越看越糊涂,根本不知道你想表达什么。(我估计没有一个人能看懂)

B15层 发表时间: 04-08-16 22:16

回复: Garu [syshunter]   版主   登录
楼主的意思已经说的很明白了。这样的问题在很多讨论区也讨论过,为什么就不看看别人是怎么做的呢?

原贴:http://www.chinaunix.net/jh/23/312721.html

THEBEST 回复于:2004-05-01 12:29:27
钱能书上一练习:

代码:

/*
  可以把n!的结果放在数组中,数组中每个元素都表示n!值的一位.
  对整数范围内的n,求n!.
  对于输入的n想办法昼精确地估计出n!所占的位数.就能确定数组元素的个数
  可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是
  n!的位数,对该式两边取对数,有�M=log10^n!即:
  M = log10^1+log10^2+log10^3...+log10^n
  循环求和,就能算得M值,该M是n!的精确位数。
  数组初始化时,令数组第一个元素(n!的第一位)为整数1,其余为0.
  在数组中计算n!时是通过将数组中的值乘2,3,4,。。一直到乘n的方式得的
  把数组的第一个元素看做是n!的最低位,最后一个元素看做是最高位。
  */
 
#include <iostream>
using namespace std;
#include <cmath>
#include <cstdlib>
#include <iomanip>
 
int getN();  //输入n
int getBitNum(int n);  //求n!的位数
char *init(int size);
void calc(char *a,int n);  //求n!
void display(char *a,int size);
 
int main()
{
    int n = getN();
    int size = getBitNum(n);
    char *pa = init(size);
    calc(pa,n);
    display(pa,size);
    delete []pa;  //note:
}
 
int getN()
{
    int n;
    cout << "Please input n of n! : ";
    cin >> n;
    while(n < 0) {
        cout << "input error,again: ";
        cin >> n;
    }
    if(n == 0)
        exit(1);
    return n;
}
 
int getBitNum(int n)
{
    double sum = 1.0;
    for(int i=1; i<=n; i++)
        sum += log10((long double)i); //参数为double &和long double&
                                      //不转换重载函数不能解析
    return int(sum); //不转换会有warning
}
 
char * init(int size)
{
    char *pa = new char[size];
    if(!pa) { //n太大时考虑申请内存不成功情况的执行动作
        cout << "too large factor of " << size << endl;
        exit(1);
    }
    pa[0] = 1;
    for(int i=1; i<size; i++)
        pa[i] = 0;
    return pa;
}
 
void calc(char *a, int n)
{
    double bitcount = 1;
    int begin = 0;
 
    for(int i=2; i<=n; ++i) {
        long add = 0;  //源为long and=0;由于and是C++关键字,所以出错。
                      //故所有为add的源文为and.不小心的出错点。
        bitcount += log10((long double)i);
        if(a[begin] == 0)
            begin++;
 
        for(int j=begin; j<int(bitcount); ++j) {
            add += (i*a[j]);
            a[j] = char(add % 10);
            add /= 10;
        }
    }
}
 
void display(char *a, int size)
{
    int bit = 0;
    for(int i=size-1; i>=0; i--) {
        if(bit % 50 == 0)
            cout << endl << "The"
                << setw(5) << (bit/50+1) << " \'s 50 bit: ";
        cout << int (a[i]);  //思考:为什么需要进行显式的整形转换呢?
        bit++;
    }
    cout << endl;
}






B16层 发表时间: 04-08-17 12:56

回复: Garu [syshunter]   版主   登录
#g++ -o test test.c
# ./test
Please input n of n! : 10

The    1 's 50 bit: 3628800
# ./test
Please input n of n! : 20

The    1 's 50 bit: 2432902008176640000
# ./test
Please input n of n! : 50

The    1 's 50 bit: 30414093201713378043612608166064768844377641568960
The    2 's 50 bit: 512000000000000


B17层 发表时间: 04-08-17 13:01

回复: mars_bys [mars_bys]   论坛用户   登录
让各位劳神了。真不好意思。
以后我会注意的!


B18层 发表时间: 04-08-17 17:46

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号