⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 可能很多人都曾经想过要实现一些比较大的数的阶乘
💻 CPP
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -