C语言设计一个程序求大数的阶乘,如10000的阶乘

C语言设计一个程序求大数的阶乘,如10000的阶乘,第1张

写的一个C++实现10000的阶乘的代码

#include<iostream>

#define N 10000//设阶乘数为10000

#define SIZE 40000//预留40000位保存结果

using namespace std;

void mul(int n1,int n2)//两数相乘

{

for(int i=0;i!=SIZE;++i)

n1[i]=n2;

for(int i=0;i!=SIZE;++i){

n1[i+1]+=(n1[i]/10);

n1[i]%=10;

}

}

int main()

{

int num=new int[SIZE];

memset(num,0,SIZE);

num[0]=1;

//N的阶乘

for(int i=1;i!=N+1;++i){

mul(num,i);

}

//输出时排除开头的0

for(int i=SIZE-1;i!=-1;--i){

if(0!=num[i]){

for(int j=i;j!=-1;--j){

cout <<num[j];

}

break;

}

}

delete[] num;

return 0;

}

很多地方不合理,尤其是需要预留空间,这就要我先预算一下会有多少位了。运算时间20秒左右,效率也不行,应该在10秒左右比较合理,机器为P3 733,内存256MB。

分析一下你的式子,不难看出,唯一在变的就是分母,而且是有规律的在变化着。可以将这种分母变化规律描述为以1为起点,步长加2的数的阶乘(注意这里用了两个‘的’)。

说到此,程序就明了了,只要声明一个循环变量和一个累加量,用一个循环语句就搞定。

int jiechen(int n)/定义求阶乘函数/

{

int i=1,s=1;

for(i=1;i<=n;i++)

{

s=si;

}

return s;

}

main()

{

int i=1;

double t=0;/注意这里的类型/

for(i=1;i<=17;i=i+2)

{

t=t+10/jiechen(i);

}

printf("%f",t);/打印的类型/

getch();

}

#!/bin/sh

factorial=1

for a in `seq 1 10 `

do

factorial=`expr $factorial\$a`

done

echo "10! = $factorial"

double 类型不能用 % 运算符,只有 char ,short,int,long 类型能用 % 类型的运算符!!!

因此:

f(a%10==0)

是错的,编译通不过。

另外,这道题目根本不是这么算的!你算法就有问题。100 的阶乘是很大的数,double 类型即使能保存的下, 也会有挺大的误差了。

题的算法是:统计数字 1 ~ 100 中间,因子2 和 因子 5 出现的次数。哪个出现的次数少,设少的出现 n 次,那么最终结果就是 n 个 10。

比如,先简单点的,统计 10 的阶乘,计算结果有多少个 10。

设因子 2 出现次数为 x,因子 5 出现次数为 y。开始 x=y=0。

1 ~ 10 中:

1,1 即不能被 2 整除(没有因子2),也不能被 5 整除(没有因子5);x=y=0。

2,1 能被 2 整除(有因子2),但是不能被 5 整除(没有因子5);x=x+1 = 1, y=0。

3,3 即不能被 2 整除(没有因子2),也不能被 5 整除(没有因子5);x=1,y=0。

4,4 能被 2 整除(有两个因子2),但是不能被 5 整除(没有因子5);x=x+2=3, y=0。

5,x=3,y=y+1 = 1

6,x=x+1=4,y=1

7,x=4,y=1

8,x=x+3=7,y=1

9,x=7,y=1

10,x=x+1=8,y=y+1=2

最终 x=8,y=2,他们中较小的是 2,因此最终的结果中有 2 个零。

实际上 10! = 3628800,结果确实是有 2 个零。

下面是程序:

#include <stdioh>

int main(int argc, char argv[])

{

// 计算 n 的阶乘

int n=100;

// x 统计因子 2 出现的次数,y 统计因子 5 出现的次数

int x=0,y=0;

int i,t;

for(i=1; i<=n; i++)

{

t = i;

while(t%2 == 0)

{

x++;

t/=2;

}

while(t%5 == 0)

{

y++;

t/=5;

}

}

printf("%d! has %d zeros at end!\n", n, (x<=y x : y));

return 0;

}

int i=1;

double sum=0,term,deno=1;

do

{

deno=denoi; // 求出分母的阶乘 即 n! 利用性质 n!= n(n-1)! 求出各个项阶乘

term=10/deno; // 每一项

sum+=term; // 对每一项求和

i++; // 相当于 n

}while(i<=4); // 4以内 各个数字的阶乘

以上就是关于C语言设计一个程序求大数的阶乘,如10000的阶乘全部的内容,包括:C语言设计一个程序求大数的阶乘,如10000的阶乘、编写程序s=1+1/3!+1/5!+1/7!+.....+1/19!、利用所学的shell命令,写出计算10的阶乘的脚本程序,如何编译如何进行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10170075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存