题目中数据很大
于是我们有了高精度算法
思路是什么呢:
一个数组里面每一位存的是十进制数三位(也可以只存一位,但是比较慢)
也可以理解成一千进制
这样能模拟大整数的乘法、加法
#include
#include
#define max(a,b) (a>b?a:b)
int n;
FILE * input, * output;
struct bigint
{
int len;
int num[1100];
}fac,sum;
void mul(int value){//高精度乘单精度
int i;
for (i=1;i<=fac.len;i++)
fac.num[i]=fac.num[i]*value;//每个数位乘上数
for (i=1;i<=fac.len;i++)
if (fac.num[i]>=1000) {//逢千进一
fac.num[i+1]+=fac.num[i]/1000;fac.num[i]%=1000;
}
if (fac.num[fac.len+1]) fac.len++;//位数可能会增加,而且最多增加1
}
void add()//给sum加上fac的值
{
int i;
//由于此时fac永远大于sum所以不用判断sum的长度
for (i=1;i<=fac.len;i++)
sum.num[i]+=fac.num[i];//每一位加上fac的值
for (i=1;i<=fac.len;i++)
if (sum.num[i]>=1000){//逢千进一
sum.num[i+1]++;sum.num[i]-=1000;//因为加法运算不可能往前进2
}
sum.len =fac.len;
if (sum.num[sum.len+1]) sum.len++;
}
void out()//输出
{
int i;
for (i=sum.len;i>=1;i--)
{
if (i{//因为如果不是第一位,其他要补0,因为如果这个数是1001,就会变成11
if (sum.num[i]<10) fprintf(output,"00");
else if (sum.num[i]<100) fprintf(output,"0");
}
fprintf(output,"%d",sum.num[i]);
}
fputc('\n',output);
}
int main(){
input = fopen("factor.in","r");
output = fopen("factor.out","w");
memset(fac.num,0,sizeof fac.num);
memset(sum.num,0,sizeof sum.num);
fscanf(input,"%d",&n);
int i;
fac.len = sum.len = 1;//初始赋成1
fac.num[1] = sum.num[1] = 1;
for (i=2;i<=n;i++)
{
mul(i);
add();
}
out();
fclose(input);fclose(output);
return 0;
}
这么大的阶乘,用C语言基本的变量是运算得不到结果的,溢出了
如果想成功运算,就需要自己写数据类型和算法了,你给的分不够啊
#include
int main()
{
int a,b,c,i,n,s=1,sum=0;
printf("请输入一个整数:n=");
scanf("%d",&n);
for(i=1;i
s=s*i;
}
printf("%d!=%d\n",n,s);
for(a=1;a<=n;a++)
{
for(b=1,c=1;b<=a;b++)//控制每个数的阶乘
{
c=b*c;
}
sum+=c;
}
printf("累加和为:%d\n",sum);
}
#include
#define SIZE 1000
void mul(int *n1,int n2)
{
int i;
for(i=0;i!=SIZE;++i)
n1[i]*=n2;
for(i=0;i!=SIZE;++i){
n1[i+1]+=(n1[i]/10);
n1[i]%=10;
}
}
int main()
{
FILE *fp;
int i,n,num[SIZE]={0};
num[0]=1;
if((fp=fopen("factor.in","rt"))==NULL)
{
printf("cannot open file\n");
return 1;
}
fscanf(fp,"%d",&n);
fclose(fp);
for(i=1;i!=n+1;++i){
mul(num,i);
}
if((fp=fopen("factor.out","wt"))==NULL)
{
printf("cannot open file\n");
return 1;
}
for(i=SIZE-1;i!=-1;--i){
if(0!=num[i]){
for(int j=i;j!=-1;--j){
fprintf(fp,"%d",num[j]);
}
break;
}
}
fclose(fp);
return 0;
}
#include
void main()
{
int i,n;
long jc=1,jch=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
jc*=i;
jch+=jc;
}
printf("1!+...+%d!=%d\n",n,jch);
}
这是最简洁、最标准算法!!!不相似才见鬼好么!!!