test.cpp

来自「数字的阶乘算法.按分解的方法,将一个大数的阶乘用数组实现.」· C++ 代码 · 共 87 行

CPP
87
字号
#include<stdlib.h>
#include<iostream.h>
#include<iomanip.h>

const int N=1000; 

int compute(unsigned int *s,int n)//s用来存储一次的计算结果,n为本次计算的乘数,函数返回结果中有效数据的节数
{
    unsigned long p;  //暂时存放一节的结果
	unsigned long more=0;//一次乘法的进位
	int i;  //循环变量

	static int m=1;//存放结果中的节数,三位一节
	static int q=0;//存放结果中最后为零的节数

	//计算本次的结果
    for(i=q;i<m;i++)
	{
		p=(long)s[i]*(long)n+more;
		more=p/N;
		s[i]=p-more*N;
	}

	//计算结果中最后为零的节数
	while(s[q]==0) q++;

	//处理最高位
	for(more=p/N;more;)
	{
		p=more;
		more=p/N;
		s[i++]=p-more*N;
		m++;    //有效节数增一
	}

	return m;  //返回有效节数
}

void main()
{
	unsigned int *s; //存放结果
	int i;           //循环变量
	int m;			 //存放节数
	int n;           //求n的阶乘

	cout<<"请输入一个正整数<0----10000>:";
	cin>>n;

	if(n<0) 
	{
		cout<<"输入数据错误!"<<endl;
		return;
	}
	else if(n==0)
	{
		cout<<"0!==1"<<endl;
		return;
	}

	//初始化s
	s=(unsigned int *)malloc(n*sizeof(s)*10);
    for(i=1;i<n;i++) s[i]=0;
	s[0]=1;

	//计算结果
	for(i=2;i<=n;i++) m=compute(s,i);

	while(s[m]==0) m--;//过滤掉前面的零

	//输出结果
	cout<<n<<"!=="<<s[m--];//最高一节
    
	int num=1;
	for(i=m;i>=0;i--) 
	{   
		num++;
		cout<<','<<setw(3)<<setfill('0')<<s[i];
	    if((num%10)==0) cout<<endl;
	}
	cout<<endl;

	//释放空间
	free(s);
}
    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?