| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1486 人关注过本帖
标题:求1000阶乘
只看楼主 加入收藏
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 10楼 二0一一628
我明白了
是因为最后的for循环中
for(j=999;....)    这里写成 j=99了
所以只打出了前99个
你改改,程序是对的
2011-07-14 22:42
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
回复 10楼 二0一一628

不对,1000!实在太大了
一开始要定义a[10000]的数组才行
然后在for那改成
 (x=0;x<10000;x++)
(j=999;j>=0)
才行

这下对了,用的是之前的代码,不够细心啊……
2011-07-14 23:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用二0一一628在2011-7-14 16:18:05的发言:

VS2010测试了下,运行出错。
出什么错?
2011-07-15 08:20
f34355281
Rank: 2
来 自:云南
等 级:论坛游民
帖 子:27
专家分:78
注 册:2011-7-11
收藏
得分:1 
回复 3楼 rjsp
C语言论坛,不要发C++来!
2011-07-15 11:45
二0一一628
Rank: 2
等 级:论坛游民
帖 子:23
专家分:16
注 册:2011-7-2
收藏
得分:0 
#include<stdio.h>
#define N 1000    //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
    for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
        s[a]=(b+=s[a]*t)%10000,b/=10000;
    for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
    return 0;
}
这个算不算最佳答案呢?
2011-08-08 15:06
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>

struct BigInt
{
    char bit[500];//最大500位整数
    int sign;//符号1位负数 0 位正数
    int nbit;//大数位数
};


void InPut(BigInt *p)//整理
{
    char *begin,*end;
    begin = p->bit;
    end = p->bit + strlen(p->bit)-1;
    int i = strlen(p->bit)-1;
    while(begin<=end)//将大数倒转并转为码存储
    {
        char temp = *begin - 48;
        *begin = *end - 48;
        *end = temp;
        begin++;end--;
    }
    for(;i>=0;i--)//计算实际位数
        if(p->bit[i])
            break;
    p->nbit = i+1;
}

void ForMat(BigInt *p)//整理大整数
{
    for(int i = p->nbit-1;i>=0;i--)
        if(p->bit[i])
            break;
    p->nbit = i+1;
}

void Multi(const BigInt *pa,const BigInt *pb,BigInt *pc)//乘法
{
    int i,j,k;
    if(pa->sign == pb->sign)//判断符号
        pc->sign = 0;
    else
        pc->sign = 1;
    for(i = 0;i<pb->nbit;i++)
    {
        int low = 0;//进位初始为0
        for(j = 0;j<pa->nbit;j++)
        {
            int pos = i+j;//计算第i+j为的结果
            int num = pb->bit[i]*pa->bit[j]+low;//临时结果加进位
            pc->bit[pos] += num%10;//当前位临时结果 可能会大于10
            low = num/10;//进位临时结果
           
            low += pc->bit[pos]/10;//进位最终结果
            pc->bit[pos] %= 10;//当前位最终结果
        }
        if(low)
            pc->bit[i+j] += low;//如果进位不为0 还要继续进位
    }
    pc->nbit = i+j+1;//结果位数
    ForMat(pc);
}
void OutPut(const BigInt *p)
{
    int i,j,k;
    if(p->nbit == 0)
    {
        printf("0\n");
        return;
    }
    if(p->sign)//符号位1 是负数
        printf("-");
    for(i = p->nbit-1;i>=0;i--)
        putchar(p->bit[i]+48);//把码转化成数
    printf("\n");
}

int main()
{
    char a[101] = {0};
    char b[101] = {0};
    BigInt zero = {0};
    BigInt b1 = {0},b2 = {0},b3 = {0};
    strcpy(b1.bit,"567456456");
    strcpy(b2.bit,"12345");
    InPut(&b1);
    InPut(&b2);
    Multi(&b1,&b2,&b3);
    OutPut(&b3);
    return 0;
}
/*
3453463453      res:119263751035385902
34534534
345345345345    res:18909991071872981900820
54756756756
5686574563456   res:32276182665043770698510336
5675856757856
567456456       res:7005249949320
12345
*/
3楼的写的这么复杂啊  大数乘法就可以吧  不过我的写的也有点复杂

不过我的这个是为了写减法 除法 求余等  篇幅长不贴了

                                         
===========深入<----------------->浅出============
2011-08-08 15:19
xraycrl
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2011-8-8
收藏
得分:0 
回复 8楼 烟雾中的迷茫
试了你的程序,输入1000后输出了好长的两排数字,呵呵!
2011-08-08 17:21
xraycrl
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2011-8-8
收藏
得分:0 
回复 9楼 obstratiker
你的程序的结果似乎是对的,能不能给出程序的注释,我看不明白,谢谢!
2011-08-08 17:30
快速回复:求1000阶乘
数据加载中...
 
   



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

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