首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

在用标准库求自然数范围内n!时碰到的奇怪有关问题.求解

2012-03-11 
在用标准库求自然数范围内n!时碰到的奇怪问题.求解原文件如下Factor.h:#pragmaonce#includevectorclassF

在用标准库求自然数范围内n!时碰到的奇怪问题.求解
原文件如下
Factor.h:
#pragma   once
#include   <vector>
class   Factor
{
size_t   n;                           //求n的n!
std::vector <size_t>   vec;               //储存结果的vector
private:
void   compute();       //计算n!
void   init();
Factor(Factor   &);
public:
void   print();                   //输出
Factor(const   size_t   &);
~Factor(void);
};


Factor.cpp:
/----------------------------

#include   "Factor.h "
#include   <iostream>
#include   <cmath>
#include   <cmath>
#include   <iomanip>
using   namespace   std;
typedef   vector <size_t> ::iterator   iter;

Factor::Factor(const   size_t   &nval)
{
if(nval   ==   0)                       //检验输入
{
cerr < < "Please   input   a   integer   more   than   zero. " < <endl;
}
n   =   nval;
compute();
}
Factor::~Factor()
{
}
//------------------------
void   Factor::compute()
{
vec.push_back(1);
for(size_t   i   =   2;i <=n;++i)
{
size_t   and   =   0;
for(iter   it   =   vec.begin();it   !=   vec.end();)
{
and   +=   i   *   (*it);
*it   =   and   %   10;  
++it;
if(and   /=   10)
{

if(it   ==   vec.end())
{
vec.push_back(and);
break;
}
}

}
}
}
//----------------------------
void   Factor::print()
{
  size_t   bit   =   0;
for(iter   it   =   vec.end();it   !=   vec.begin();--it)
{
if(bit   %   50   ==   0)
cout   < <endl < < "第 " < <setw(3) < <(bit/50+1) < < "个50位: ";
cout   < <   size_t(   *(it-1)   );
++bit;
}
cout < <endl;
}


main.cpp:
//----------------------------------
#include   "Factor.h "
#include   <iostream>
using   namespace   std;
int   main()
{
size_t   anum;
cout < < "Input   the   number   you   want   to   compute: ";
cin   > > anum;
Factor   a(anum);
cout < < "the   " < <anum < < "!   is: " < <endl;
a.print();
return   0;
}

该程序的奇怪之处在于当n=30左右时还能正确输出结果,但是当n=40以后结果就错误了,莫名其妙?难道是vector本身什么特性的问题?

[解决办法]
if(and /= 10)
{

if(it == vec.end())
{
vec.push_back(and);
break;
}
}
问题恐怕在这里。and / 10很可能仍然大于10的。要while循环做这个操作。

热点排行