//http://ac.jobdu.com/problem.php?cid=1040&pid=60
#include <stdio.h>
#include <string.h>
struct bigInteger //高精度整数结构体
{
int digit[1000]; //四位数一个单元保存数值
int size; //下一个未使用的数组单元
void init() //结构体初始化
{
for (int i=0;i<1000;i++)
{
digit[i]=0; //数位清0,size清0
size=0;
}
}
void set(int x) //从字符串中提取整数
{
init();
do
{
digit[size++]=x%10000; //对小整数,四位一单元保存到digit中
x/=10000;
} while (x!=0);
}
void output() //高精度整数输出
{
for (int i=size-1;i>=0;i--) //例:110001 -> 0011 0001 四位形式
{
if (i!=size-1) //不是最高位时,按四位格式输出0001 否则就只会输出1 ,那么最终结果就会111
{
printf("%04d",digit[i]);
}
else
printf("%d",digit[i]); //最高位时,只输出整数11
}
printf("\n");
}
bigInteger operator * (int x)const //x是乘数(小整数)
{
bigInteger ret; //返回值,即两数相加结果
ret.init();
int carry=0; //进位,初始值为0
for (int i=0;i<size;i++) //被乘数每一位都要* x
{
int tmp=digit[i]*x+carry; //小整数x乘以当前数值再加上来自低位的进位
carry=tmp/10000; //计算进位,如12345,进位 1 剩余2345
tmp%=10000; //去除进位部分,取后四位
ret.digit[ret.size++]=tmp; //保存该位结果
}
if (carry!=0) //计算结束后若最高位有进位
{
ret.digit[ret.size++]=carry; //保存该进位
}
return ret;
}
}a;
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
a.init();
a.set(1);
for (int i=1;i<=n;i++)
{
a=a*i;
}
a.output();
}
return 0;
}
题目61:N的阶乘
最新推荐文章于 2022-05-08 03:42:17 发布