大数阶乘
来源:互联网 发布:域名属性 编辑:程序博客网 时间:2024/05/16 04:47
本程序主要计算超大数的阶乘运算
#include<stdio.h>
#define maxsize 10000 //定义数组大小
int main()
{
int fun(int *a,int n,int i);
int a[maxsize]={0}; //j将数组赋值为0;
int n,i,j;
scanf("%d",&n);
if(n==0)
printf("1\n");
else
{
i=maxsize-1; //i取数组的最后一个单元
a[i]=1; //并将最后一个单元赋值为1;
while(n!=1)
{
i=fun(a,n,i); //将返回的值给i; 这时的i指向第一个数组元素不为0的数
n--;
}
j=i; //j从i开始,i记录的是第一个不为0的数的位置
for(;j<maxsize;j++)
{
if(a[j]==0)
printf("0000"); //因为四个连续的0在一个数组元素中只会存一个0,所以要特别输出四个0
else if(a[j]<10&&j!=i) //因为每个数组元素都是存一个四位,所以输出时也要是一个四位
printf("000%d",a[j]); //但是第一个数组元素可能不是一个四位数
else if(a[j]<100&&j!=i)
printf("00%d",a[j]);
else if(a[j]<1000&&j!=i)
printf("0%d",a[j]);
else
printf("%d",a[j]);
}
printf("\n");
}
return 0;
}
int fun(int *a,int n,int i)
{
int j,k,m,p,up;
for(p=maxsize-1;p>=i;p--) //p从最后开始一次往前乘以n;
a[p]=a[p]*n;
for(j=maxsize-1;j>=0;j--) //j从最后开始对每一个元素进行处理,直到数组的第一个数
{
k=j; //k记录j走到的位置
m=a[j]; //并用m取这个位置的数值
if(m!=0) //如果m等于0,说明这个位置不用进行往前进位
{
up=j; //up保留j位置每次不为0的位置,最后up保留的就是从前往后第一个不为0的数的位置,
while(m>=10000) //如果不等于0,判断是否大于五位数,
{
a[k]=m%10000; //如果大于五位数。则取后四位数保留下来
m=m/10000; //m的值去掉后四位
a[k-1]=a[k-1]+m; //并把剩的数往前进位,即将剩余的数往前加
k--; //k的位置往前移
m=a[k]; //并把该位置的数给m,接着判断是否大于五位数
}
}
}
return up; //把up的位置返回给i;这时up指向第一个不为0的位置
}
- 大数阶乘
- 大数阶乘。
- 大数阶乘
- ~阶乘~大数
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘
- 大数阶乘!!
- 大数阶乘
- 大数阶乘
- 大数阶乘
- java中的泛型笔记
- 文章标题
- 模板方法模式
- 局部加权线性回归及岭回归之Python实现
- 全文检索引擎Solr系列——入门篇
- 大数阶乘
- Spring概述
- Socket库函数介绍
- P124.44
- Oracle数据库to_date函数注意事项
- 知道一个人的手机号怎么才能查到他的微信号码
- 知道一个人的微信号怎么才能查到他的手机号码
- 只知道QQ号怎么能查到对方与他好友的聊天内容
- 只知道对方的微信号码可以查看微信聊天记录吗