Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
如n=10000,求N!
采用万进制,逢万进一,结果存于a数组,结果倒序输出,每个a[i]不足四位前面补0
#include <bits/stdc++.h>
using namespace std;
void f(int n){
int a[10000+1]={1},carry,digits=1;
for(int i=2;i<=n;i++){
carry=0;
for(int j=0;j<digits;j++){
a[j]=a[j]*i+carry;
carry=a[j]/10000; //进位
a[j]=a[j]%10000; //余数
}
if(carry>0)
a[digits++]=carry;
}
printf("%d",a[digits-1]);
for(int j=digits-2;j>=0;j--)
printf("%04d",a[j]);
printf("\n");
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
f(n);
}
return 0;
}
#include <stdio.h>
int main()
{
int a[20001];//储存每一位所得到的数
int temp,digit,n,i,j=0;//temp每次的得数 digit每次得数的位数
scanf("%d",&n);
a[0]=1;//从1开始乘
digit=1;//位数从第一位开始
for(i=2;i<=n;i++)
{
int num=0;
for(j=0;j<digit;j++)
{
temp=a[j]*i+num;//将一个数的每一位数都分别乘以i,
a[j]=temp%10;//将一个数的每一位数利用数组进行储存
num=temp/10;
}
while(num)//判断退出循环后,num的值是否为0
{
a[digit]=num%10;//继续储存
num=num/10;
digit++;
}
}
for(i=digit-1;i>=0;i--)//倒序输出每一位
printf("%d",a[i]);
printf("\n");
return 0;
}