高手帮忙

有不有办法让解决溢出的问题呢?还请大家帮帮忙!小弟在这里先谢过大家了~main(){longt,n;t=1;n=2;while(n<=100)/*n如何才能到100不溢出... 有不有办法让解决溢出的问题呢?还请大家帮帮忙!
小弟在这里先谢过大家了~

main()
{
long t,n;
t=1;
n=2;
while(n<=100) /* n如何才能到100不溢出呢?*/
{t=t*n;
n=n+1;}
printf("%ld",t);
}
展开
 我来答
百度网友7483f44
2007-04-02 · TA获得超过1195个赞
知道小有建树答主
回答量:662
采纳率:0%
帮助的人:1009万
展开全部
这个是因为100!超了int的范围。可以写一个高精度算法,我这里正好有大数的模版,用这个就行了。
#include<iostream>
#include<string>
#include<iomanip>
#include<algorithm>
using namespace std;
#define MAXN 9999
#define DLEN 4
class BigNum{
public:
int a[10000];//?????????
int len; //????
public:
BigNum(){len = 1;memset(a,0,sizeof(a));}
BigNum(const int);
BigNum(const char*);
BigNum(const BigNum &);
BigNum &operator=(const BigNum &);
//BigNum &operator>>
// friend ostream& operator>>(ostream&, BigNum&);
BigNum operator+(const BigNum &) const;
BigNum operator-(const BigNum &) const;
BigNum operator*(const BigNum &) const;
BigNum operator/(const int &) const;
BigNum operator^(const int &) const;
int operator%(const int &) const;
bool operator>(const BigNum & T)const;
void print();
};
// ostream& operator>>(ostream&os, BigNum &b)
// {
// char ch;
// int i = -1;
// ch = cin.get();
// while (ch != '\n')
// {
// b.a[++i] = ch - 48;
// ch = cin.get();
// }
// b.len = i;
// return os;
//
//}

BigNum::BigNum(const int b)
{
int c,d = b;
len = 0;
memset(a,0,sizeof(a));
while(d > MAXN){
c = d - (d / (MAXN + 1)) * (MAXN + 1);
d = d / (MAXN + 1); a[len++] = c;
}
a[len++] = d;
}
BigNum::BigNum(const char*s)
{
int t,k,index,l;
memset(a,0,sizeof(a));
l=strlen(s);
len=l/DLEN;
if(l%DLEN)len++;
index=0;
for(int i=l-1;i>=0;i-=DLEN){
t=0;k=i-DLEN+1;
if(k<0)k=0;
for(int j=k;j<=i;j++)
t=t*10+s[j]-'0';
a[index++]=t;
}
}
BigNum::BigNum(const BigNum & T) : len(T.len)
{
int i;
memset(a,0,sizeof(a));
for(i = 0 ; i < len ; i++)a = T.a;
}
BigNum & BigNum::operator=(const BigNum & n)
{
len = n.len;
memset(a,0,sizeof(a));
for(int i = 0 ; i < len ; i++)
a = n.a;
return *this;
}
BigNum BigNum::operator+(const BigNum & T) const
{ BigNum t(*this);
int i,big;//??
big = T.len > len ? T.len : len;
for(i = 0 ; i < big ; i++)
{
t.a +=T.a;
if(t.a > MAXN)
{
t.a[i + 1]++;
t.a -=MAXN+1;
}
}
if(t.a[big] != 0) t.len = big + 1;
else t.len = big;
return t;
}
BigNum BigNum::operator-(const BigNum & T) const
{
int i,j,big;
bool flag;
BigNum t1,t2;
if(*this>T){
t1=*this;
t2=T;
flag=0;
}else{
t1=T;
t2=*this;
flag=1;
}
big=t1.len;
for(i = 0 ; i < big ; i++){
if(t1.a < t2.a){
j = i + 1;
while(t1.a[j] == 0) j++;
t1.a[j--]--;
while(j > i) t1.a[j--] += MAXN;
t1.a += MAXN + 1 - t2.a;
}
else t1.a -= t2.a;
}
t1.len = big;
while(t1.a[len - 1] == 0 && t1.len > 1){
t1.len--;
big--;
}
if(flag)t1.a[big-1]=0-t1.a[big-1];
return t1;
}
BigNum BigNum::operator*(const BigNum & T) const
{
BigNum ret;
int i,j,up;
int temp,temp1;
for(i = 0 ; i < len ; i++){
up = 0;
for(j = 0 ; j < T.len ; j++){
temp = a * T.a[j] + ret.a[i + j] + up;
if(temp > MAXN){
temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
up = temp / (MAXN + 1);
ret.a[i + j] = temp1;
}
else {
up = 0;
ret.a[i + j] = temp;
}
}
if(up != 0)
ret.a[i + j] = up;
}
ret.len = i + j;
while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
return ret;
}
BigNum BigNum::operator/(const int & b) const
{
BigNum ret;
int i,down = 0;
for(i = len - 1 ; i >= 0 ; i--){
ret.a = (a + down * (MAXN + 1)) / b;
down = a + down * (MAXN + 1) - ret.a * b;
}
ret.len = len;
while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
return ret;
}
int BigNum::operator %(const int & b) const
{
int i,d=0;
for (i = len-1; i>=0; i--){
d = ((d * (MAXN+1))% b + a)% b;
}
return d;
}
BigNum BigNum::operator^(const int & n) const
{
BigNum t,ret(1);
int i;
if(n<0)exit(-1);
if(n==0)return 1;
if(n==1)return *this;
int m=n;
while(m>1){
t=*this;
for( i=1;i<<1<=m;i<<=1){
t=t*t;
}
m-=i;
ret=ret*t;
if(m==1)ret=ret*(*this);
}
return ret;
}
bool BigNum::operator>(const BigNum & T) const
{
int ln;
if(len > T.len) return true;
else if(len == T.len){
ln = len - 1;
while(a[ln] == T.a[ln] && ln >= 0) ln--;
if(ln >= 0 && a[ln] > T.a[ln]) return true;
else return false;
}
else return false;
}
void BigNum::print()
{
int i;
cout << a[len - 1];
for(i = len - 2 ; i >= 0 ; i--){
cout.width(DLEN);
cout.fill('0');
cout << a;
}
cout << endl;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式