一个简单的求99阶乘的程序。

//求99的阶乘
#include <vector>
#include <iostream>
using namespace std;

//100的阶乘
/************************************************************************/
/* 9332621544394415268169923885626670049071596826438162146859296389521759
9993229915608941463976156518286253697920827223758251185210916864000000000
000000000000000*/
/************************************************************************/
void main()
{
 vector<int> v; 
 v.push_back(1);

 vector<int> temp1;  //存个位数临时乘积
 vector<int> temp2;  //存十位数临时乘积

 vector<int>::iterator itor,itor1,itor2;
 for (int n=1;n<100;n++)    //16的阶乘算错
 {
  int i1=0;  //个位数
  int i2=0;  //十位数

  int res1=n%10;  //个位数
  int res2=n/10;  //十位数

        itor=v.begin();
  temp2.push_back(0);  //十位数压0入栈
  for (;itor!=v.end();++itor)
  {
              int j=*itor;
   int k1=j*res1;  //乘数的个位数与之乘
   i1+=k1;
   temp1.push_back((i1%10));  //个位数乘积压栈
   i1=i1/10;  //进位

   int k2=j*res2;  //乘数的十位数与之乘   
   i2+=k2;   
   temp2.push_back((i2%10));  //十位数乘积压栈   
   i2=i2/10;  //进位
  }
  if(i1!=0)
   temp1.push_back(i1);
  if(i2!=0)
   temp2.push_back(i2);

  itor1=temp1.begin();
  itor2=temp2.begin();
  int temp_sum=0;
  v.clear();//将v清空,接受新数据
  while (itor1!=temp1.end() && itor2!=temp2.end())
  {
   temp_sum+=(*itor1)+(*itor2);
   v.push_back((temp_sum%10));
   temp_sum=temp_sum/10;
   ++itor1;
   ++itor2;
  }
  while(itor1!=temp1.end())
  {
   temp_sum += (*itor1);
   v.push_back((temp_sum%10));
   temp_sum=temp_sum/10;
   ++itor1;
  }
  while(itor2!=temp2.end())
  {
   temp_sum += (*itor2);
   v.push_back((temp_sum%10));
   temp_sum=temp_sum/10;
   ++itor2;
  }
  //这里有可能十位数和个位数临时乘积相同的位数,同时到向量的尾部,
  //而temp_sum不为0,即最高位有向前的进位,在26的阶层乘27时第一次产生这种情况
  if(temp_sum!=0) 
   v.push_back(temp_sum);

  temp1.clear();  //临时积清空
  temp2.clear();  //临时积清空
 }
 //逆向输出
 for (itor=v.end()-1;itor!=v.begin();--itor)
  cout<<*itor;
 cout<<*itor;  //输出v.begin()

 cout<<endl;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值