
C中,请分析一下求1997!值的程序,1997!已超过计算机所能表示整数范围,不能用n!=n*(n-1),请看补充:
这个方法,请看补充:#include<stdio.h>#defineMaxlen10000intmult(intnum[],intlen,intn);voidmain()...
这个方法,请看补充:
#include <stdio.h>
#define Maxlen 10000
int mult(int num[],int len,int n);
void main()
{int num[Maxlen];
int len=1,i,N;
printf("input N:");
scanf("%d",&N);
num[0]=1;
for(i=2;i<=N;i++)/*这许多循环又有什么用,请帮我全面分析一下这个求阶乘程序,谢谢*/
len=mult(num,len,i);
for(i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
getch();
}
int mult(int num[],int len,int n)
{int i,rem=0;
for(i=0;i<len;i++) { /*从这开始,我有些看不懂,它是怎样进行的?*/
rem+=num[i]*n;
num[i]=rem%10;
rem/=10;}
if(rem>0)
{num[len]=rem%10;
len++;
rem/=10;}
return len;
} 展开
#include <stdio.h>
#define Maxlen 10000
int mult(int num[],int len,int n);
void main()
{int num[Maxlen];
int len=1,i,N;
printf("input N:");
scanf("%d",&N);
num[0]=1;
for(i=2;i<=N;i++)/*这许多循环又有什么用,请帮我全面分析一下这个求阶乘程序,谢谢*/
len=mult(num,len,i);
for(i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
getch();
}
int mult(int num[],int len,int n)
{int i,rem=0;
for(i=0;i<len;i++) { /*从这开始,我有些看不懂,它是怎样进行的?*/
rem+=num[i]*n;
num[i]=rem%10;
rem/=10;}
if(rem>0)
{num[len]=rem%10;
len++;
rem/=10;}
return len;
} 展开
3个回答
展开全部
#include <stdio.h>
#define Maxlen 10000
int mult(int num[],int len,int n);
void main()
{
int num[Maxlen]; //逆序存储所算出来的值
int len=1,i,N; //N表示待求阶乘数,len表示结果的位数
printf("input N:");
scanf("%d",&N);
num[0]=1;
for(i=2;i<=N;i++) //这个循环有两个作用:1、求出结果的位数 2、运算出结果再逆序存入num[]中
len=mult(num,len,i);
for(i=len-1;i>=0;i--) //逆向输出num[]
printf("%d",num[i]);
printf("\n");
getch(); //等待外部中断
}
/******************************************************/
//下一个分函数有些复杂,我以N=5演示一遍
//当计算到N=4时,在主函数中,有num={4、2},len=2,i=4
//首先,i++,即i=5;进入分函数,有n=5,len=2;
/*****************************************************/
int mult(int num[],int len,int n)
{
int i,rem=0;
for(i=0;i<len;i++) //这个循环作用是按位求出f(n-1)*n的值,n=5时,
// i=0,由于num[0]=4; rem=20,个位数0保存在num[0]中
//十位数累加算作下一次运算的个位数
//然后i=1,rem=12(原数120的十百位)
//将此时的个位2存入num[1],十位1下一个循环处理
{
rem+=num[i]*n;
num[i]=rem%10;
rem/=10;
}
if(rem>0) //这个也有两个作用:
//1.将上次循环的最高一位存入数组num
//没有则不存
//2.累计len,在原来基础上+1或0
{
num[len]=rem%10;
len++;
rem/=10;
}
return len;
}
//PS:我一直不知道这种超大数该怎么搞,谢谢lz提供的程序
//类似的程序我看过一个求∏的,这类程序的精华在于将一个大数按
//每一位由低到高分别计算,然后在数组中低位存储结果的个位(不再会改
//变),高位与下一次运算的个位累加存入本个数组单元
#define Maxlen 10000
int mult(int num[],int len,int n);
void main()
{
int num[Maxlen]; //逆序存储所算出来的值
int len=1,i,N; //N表示待求阶乘数,len表示结果的位数
printf("input N:");
scanf("%d",&N);
num[0]=1;
for(i=2;i<=N;i++) //这个循环有两个作用:1、求出结果的位数 2、运算出结果再逆序存入num[]中
len=mult(num,len,i);
for(i=len-1;i>=0;i--) //逆向输出num[]
printf("%d",num[i]);
printf("\n");
getch(); //等待外部中断
}
/******************************************************/
//下一个分函数有些复杂,我以N=5演示一遍
//当计算到N=4时,在主函数中,有num={4、2},len=2,i=4
//首先,i++,即i=5;进入分函数,有n=5,len=2;
/*****************************************************/
int mult(int num[],int len,int n)
{
int i,rem=0;
for(i=0;i<len;i++) //这个循环作用是按位求出f(n-1)*n的值,n=5时,
// i=0,由于num[0]=4; rem=20,个位数0保存在num[0]中
//十位数累加算作下一次运算的个位数
//然后i=1,rem=12(原数120的十百位)
//将此时的个位2存入num[1],十位1下一个循环处理
{
rem+=num[i]*n;
num[i]=rem%10;
rem/=10;
}
if(rem>0) //这个也有两个作用:
//1.将上次循环的最高一位存入数组num
//没有则不存
//2.累计len,在原来基础上+1或0
{
num[len]=rem%10;
len++;
rem/=10;
}
return len;
}
//PS:我一直不知道这种超大数该怎么搞,谢谢lz提供的程序
//类似的程序我看过一个求∏的,这类程序的精华在于将一个大数按
//每一位由低到高分别计算,然后在数组中低位存储结果的个位(不再会改
//变),高位与下一次运算的个位累加存入本个数组单元
展开全部
for(i=2;i<=N;i++)/*这许多循环又有什么用,请帮我全面分析一下这个求阶乘程序,谢谢*/
len=mult(num,len,i);
如果i<=N成立一次,调用mult函数一次,并将num,len,i的值传到mult里去运行mult函数。然后将len 的值返回到主函数.
for(i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
输出num[]的值
for(i=0;i<len;i++) { /*从这开始,我有些看不懂,它是怎样进行的?*/
rem+=num[i]*n;
num[i]=rem%10;
rem/=10;}
如果i<len(主函数传出的len值)成立,rem =rem+num[i]*n
num[i]=rem除以10取余
rem = rem/10;
返回len的值,
建议将rem的值定义为double型。
len=mult(num,len,i);
如果i<=N成立一次,调用mult函数一次,并将num,len,i的值传到mult里去运行mult函数。然后将len 的值返回到主函数.
for(i=len-1;i>=0;i--)
printf("%d",num[i]);
printf("\n");
输出num[]的值
for(i=0;i<len;i++) { /*从这开始,我有些看不懂,它是怎样进行的?*/
rem+=num[i]*n;
num[i]=rem%10;
rem/=10;}
如果i<len(主函数传出的len值)成立,rem =rem+num[i]*n
num[i]=rem除以10取余
rem = rem/10;
返回len的值,
建议将rem的值定义为double型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
学习一下,我也在寻求大数阶乘的求法,平时我都是用java做的 很方便 可是C用字符串来处理 因为无论你用什么类型都无法存储这么大的一个数 定义为double也不会得到真确答案的..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询