大整数(可怕的阶乘)

题目标题:

·        计算阶乘n!是一件可怕的事情,因为当n并不是很大时,n!将是一个很大的值。例如13! = 6227020800,已经超过了我们常用的unsigned int类型的取值范围。请设计一个程序,使其可以计算100以内的数的阶乘,结果用字符串的形式输出

详细描述:

·        接口说明

原型:

void CalcNN(int nchar *pOut)

输入参数:

int 需要计算的阶乘数

输出参数:

char *pOut 结算结果,内存由调用者负责管理

返回值:

限制:

举例:

 

涉及知识点:

·        数字处理

 

性能要求:

·        无


#include <iostream>

#include <string>
#include <vector>
using namespace std;


class BigInteger
{
public:
BigInteger( long long num = 0)
{
*this = num;
}
BigInteger operator=( long long num)
{
s.clear();
do{
s.push_back(num%BASE);
num = num/BASE;
}while( num >0 );
return *this;
}
BigInteger operator=(const string& str)
{
s.clear();
int x;
int len = (str.length() + 7)/WIDTH ;
for(int i = 0;i<len;i++)
{
int end = str.length() - i*WIDTH;
int start = max(0,end-WIDTH);
sscanf(str.substr(start,end - start).c_str(),"%d",&x);
s.push_back(x);
}
return *this;
}
BigInteger operator+(BigInteger x);
BigInteger operator *(BigInteger x);
public:
static const int BASE = 100000000;
static const int WIDTH = 8;
vector <int> s;
};
BigInteger BigInteger::operator+(BigInteger x)
{
BigInteger t;
t.s.clear();
int z = 0,c = 0;
for(int i = 0; i <s.size() || i<x.s.size() || c != 0; i++)
{
z = 0;
if( i <s.size() && i<x.s.size() ) { z = x.s[i] + this->s[i]; }
if(  i <s.size() &&  i>=x.s.size() ) { z = this->s[i]; }
if(  i >=s.size() &&  i < x.s.size() ) { z = x.s[i] ; }
z += c;
t.s.push_back(z%this->BASE);
c = z/this->BASE;
}
return t;
}


BigInteger BigInteger::operator *(BigInteger x) //第二个乘数小于等于8位
{
BigInteger t;
t.s.clear();
long long z = 0,c = 0;
for(int i = 0; i <s.size() || c != 0; i++)
{
z = 0;
if( i <s.size()  ) { z = (long long)x.s[0]  * (long long)this->s[i]; }
z += c;
t.s.push_back( z%this->BASE );
//cout<<i<<" :"<< z%this->BASE<<endl;
c = z/this->BASE;
}
return t;
}
void CalcNN(int n, char *pOut)
{
BigInteger a=1;
for( int i = n ; i>=1;i--)
{
a = a * i;
}
sprintf(pOut,"%d",a.s.back());
int len = strlen(pOut);
//char buf[10];
for(int i = a.s.size() -2 ;i >=0; i--)
{
sprintf(pOut+len,"%08d",a.s[i]);
len +=8;
//for(int j = 0;j<8;j++) cout<<buf[j];  //???
}
}


char p[10000];
int main()
{
int n = 0;
cin>>n;
CalcNN(n,p);
cout<<p<<endl;
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 课题内容和要求 1、系统的基本功能及要求 (1)写一个类BigInteger,并有如下成员函数operator+/ operator-/ operator*/ operator\,即整数的四则运算并重载运算符。 (2)用该大整数计算n的阶乘并显示出来。(n∈[1,100]) 注:为了简化,可不考虑负数,则遇上形如“2-4”这样的表达式需要报错。 2、程序执行过程 (1)系统从键盘读入自然数n,直到输入了合法的n为止。 (2)输出运算的结果,为便于观察结果,每输出四位中间插入空格,格式如下(例如,n=12): 12!= 4790 0160 0 (3)询问用户是否继续进行,用户选择“是”,直到输入合法为止,转(1),否则退出程序。 3、算法要求及提示 (1)因为n较大时,n!的结果将超出长整形的保存范围,因此结果不能用long int型的变量来保存。本算法要求用链表来存储。 (2)链表的每一个节点存储结果的一位数字,因此结果的输出实际上是链表的遍历问题,同时要先考虑用多少位来表示大整数。 4、其他要求 (1)输入时具备一定的容错性判断,如输入的不是数字,或输入的数超过范围等等。 (2)变量、函数命名符合规范。 (3)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。 (4)程序的层次清晰,可读性强。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值