大数计算

// MyTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

#ifndef BIG_INT_ARRAY_MAXLEN
#define BIG_INT_ARRAY_MAXLEN 50000	//大整数计算结果值,最大长度预设
#endif

//计算n的m次方, n为底数, m为指数
void BigintPow(int n, int m)
{
	int a,i,b;	//a是指数的计次变量;i是第几位之变量; b是输出的计次变量
    int v,s;	//v是进位暂存量; s用来记录整数位数
	int x[BIG_INT_ARRAY_MAXLEN]={0};
	v=0; //清空v的值
	s=1; //不管怎样,s必然>=1,因此整数一定有位数
	x[0]=1; //先让最早要乘的这格阵列值=1
	for(a=1; a<=m; a++)
	{
		for(i=0;i<s;i++)
		{
			x[i]=x[i]*n+v; //各个位数运算式子,v是有进位时要加上去的
			v=x[i]/10; //v>0,进位
			x[i]=x[i]%10; //每格存一位数
			if( v!=0 && i+1 == s) //判断位数是否+1
				s++; //记录整数位数
		}
	}
	
	cout << "pow(" <<n <<"," <<m<<")=";
	for(b=s-1;b>=0;b--) //反向輸出
	{
		cout << x[b];
	}
	cout << endl << "共" << s << "个位數" << endl;
}

//大数阶乘, n!=1*2*3..*n;
void BigintFactorial(int n)
{
	int a,i,b;	//a是阶乘计次变量;i是第几位之变量; b是输出的计次变量
    int v,s;	//v是进位暂存量; s用来记录整数位数
	int x[BIG_INT_ARRAY_MAXLEN]={0};
	v=0; //清空v的值
	s=1; //不管怎样,s必然>=1,因此整数一定有位数
	x[0]=1; //先让最早要乘的这格阵列值=1
	for(a=1; a<=n; a++)
	{
		for(i=0;i<s;i++)
		{
			x[i]=x[i]*a+v;			//各个位数运算式子,v是有进位时要加上去的
			v=x[i]/10;				//v>0,进位
			x[i]=x[i]%10;			//每格存一位数
			if( v!=0 && i+1 == s)	//判断位数是否+1
				s++;				//记录整数位数
		}
	}
	
	cout << n <<"!" <<"=";
	for(b=s-1;b>=0;b--) //反向输出
	{
		cout << x[b];
	}
	cout << endl << "共" << s << "个位數" << endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
	BigintPow(2,164);
	BigintFactorial(1000);
	system("pause");
	return 0;
}

 

运行结果:大数计算

 

你可能感兴趣的:(阶乘,大数运算,幂运算)