写的一个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的阶乘的脚本程序,如何编译如何进行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)