c语言求阶乘按位存储数组?c语言如何求一个数的阶乘
一、利用C语言求阶乘 例如求20! 用循环和函数两种方法……
由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[]存储:
N=a[m]×10^(m-1)+a[m-1]×10^(m-2)+…+a[2]×10^1+a[1]×10^0
并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5!=120,在数组中的存储形式为:
3 0 2 1……
对应:a[0] a[1] a[2] a[3]
首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。
计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次(即k个(k-1)!相加)后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。对应程序如下:
#include<stdio.h>
#include<malloc.h>
#define MAXN 1000
/*factorial:求k的阶乘:连续加(k-1)次(k-1)!,便得到了k!
结果保存在数组a中。a[0]为结果的位数,其后
下标从小到大表示阶乘的低位到高位
*/
void factorial(int a[],int k)
{
int*b,m=a[0],i,j,r,carry;
b=(int*) calloc(m+1, sizeof(int));
for( i=1;i<=m;i++)//保存a原来的值,用来加。a保存累加的结果
b[i]=a[i];
for( j=1;j<k;j++)//上一次阶乘的值加(k-1)次
{
for( carry=0,i=1;i<=m;i++)//从第一位开始,到最后一位止,依次加(k-1)!中对应数字
{//如果累加得到的位数m大于原来的位数a[0],多出来的位应不断加上进位的值
r=(i<=a[0]?a[i]+b[i]:a[i])+carry;
a[i]=r%10;//求余位
carry=r/10;//求进位的值
}
if(carry) a[++m]=carry;//最后一次处理
}
a[0]=m;//用新的位数值m来更新a[0],以防m有增加。
free(b);
}
/*printFactorial:打印数组a中保存的k的阶乘的结果*/
void printFactorial(int*a,int k)
{
int i;
printf("%4d!=",k);
for(i=a[0];i>0;i--)//从高位到低位打印阶乘的结果
printf("%d",a[i]);
printf("\n");
}
//主函数
int main()
{
int a[MAXN]={0},n,k;
printf("====用递推法求阶乘====\n");
printf("请输入正整数n:");//输入n,求n!
scanf("%d",&n);
a[0]=1;//初始化,1的阶乘是1位
a[1]=1;//1!的值为1
printFactorial(a,1);//打印它的结果
for(k=2;k<=n;k++)
{
factorial(a,k);//利用上次的结果来求k!
printFactorial(a,k);//每次都打印k!
}
return 0;
}
二、C语言:编写程序,求20的阶乘.
给你个通用的。运行后输入20
记得多加点分
#define M 20000/*最大结果位数,DOS能访问的内存有限,最好不要超过 30000位*/
#define N(M+5)
main()
{
int Num;
register int i,j,k,flag;
register unsigned int n,m,pc;
unsigned char str_n[5],result_0[N],result_1[N];
void fun_print_result(char*result,int flag);
int fun_mul(char*a,char*b,char*c,int flag);
printf("输入计算其阶乘的数:Num=");
scanf("%d",&Num);
if(Num>= 100)
{
printf("\n正在进行阶乘运算...\n");
printf("已完成 00000的阶乘,请等待...");
}
for(j=0;j<N;j++)
{
result_1[j]= 0; result_0[j]= 0;
}
result_1[N-1]= 1;
for(i=0;i<5;i++)
{
str_n[i]= 0;
}
n= 1;
pc= 0; flag= N-1;
while(n<= Num)
{
m= n;
k= 4;
while(m> 0)
{
str_n[k]= m%10; m/= 10; k--;
}
if(pc%2== 0)
{
if(fun_mul(str_n,result_1,result_0,flag)!= 1)
{
printf("\n\n结果溢出!当前所设置的最大结果为%d位已完成%d的阶乘",M,pc);
exit(0);
}
}
else
{
if(fun_mul(str_n,result_0,result_1,flag)!= 1)
{
printf("\n\n结果溢出!当前所设置的最大结果为%d位已完成%d的阶乘",M,pc);
exit(0);
}
}
flag= flag-(4-k);/* flag标记相乘后“可能的”第一个有效数字的标号*/
if(pc%2== 0)/*再处理一次使 flag正好标记第一个有效数字的标号*/
{
if(result_0[flag]== 0) flag++;
}
else
{
if(result_1[flag]== 0) flag++;
}
n++; pc++;
if((pc)%25== 0&& Num>= 100&& pc>= 100)
{
printf("\r已完成%5d",pc);
}
}
if(Num>= 100) printf("\n");
if((pc-1)%2== 0)
{
fun_print_result(result_0,flag);
}
else
{
fun_print_result(result_1,flag);
}
}
int fun_mul(char*a,char*b,char*c,int flag)/*相乘函数*/
{
register int i,j;
for(j=flag;j<N;j++) c[j]=0;
for(i=4;i>=0;i--)
{
if(a)
{
for(j=N-1;j>=flag;j--)
{
if(b[j])
{
c[i+j-4]+= a[i]*b[j];
}
if(c[i+j-4]> 9)
{
c[i+j-5]+= c[i+j-4]/10; c[i+j-4]%= 10;
}
}
}
}
if(flag< 10)
{
if(c[0]|| c[1]|| c[2]|| c[3]|| c[4])/***结果溢出判断***/
{
return 0;
}
}
return 1;
}
void fun_print_result(char*result,int flag)/*输出结果函数*/
{
int p;
printf("\n本次计算结果共有%d位,如下:\n\n",N-flag);
for(p=flag;p<N-1;p++)
{
printf("%d",result[p]);
if((p+1-flag)%(21*80)== 0)
{
printf("\n计算结果太长,请按任一键看下一屏,Esc退出");
if(getch()== 27)
{
clrscr(); exit(0);
}
clrscr();
}
}
printf("%d",result[N-1]);
printf("\n\n[OK]");
}
三、c语言如何求一个数的阶乘
n的阶乘就是从1到的累积,所以可以通过一个for循环,从1到n依次求积即可。
参考代码:
#include"stdio.h"
int main(){
int n,i,s=1;
scanf("%d",&n);
for(i=1;i<=n;i++)//for循环求累积
s=s*i;
printf("%d\n",s);
return 0;
}
/*
运行结果:(例如求5的阶乘)
5
120
*/
扩展资料:
return用法:
return返回一个数值的意思就是把return<表达式>后面表达式的值返回给调用他的函数。举个例子:
int sum(int i,int j)
{
return i+j;
printf("这个语句不会被执行,因为该子函数执行到上面的return语句就无条件结束了");
}
main()
{
int a=10,b=11,c;
c=sum(a,b);
printf("%d",c);
}