说说我的看法吧,既然你编写程序采用的是标准c提供的内部数据类型,
那就意味着本身就是有一定的精度和范围的,例如标准c++的双精度就占
8个字节64位的字长,如果你需要的精度或者范围超出了它所能表示的,
那只能溢出了,如果解决这一问题,建议选择自定义抽象数据类型,举个
简单的例子吧,实现很大范围的整数运算,你可以定义以下这样一个类,
我大概写了一些,供你参考:
#ifndef ARITHMETIC_H
#define ARITHMETIC_H
#include<iostream.h>
#include<cmath>
#include"LinkedStack.h"
////////////////////////////////////////////////////////
//Decimal类的声明和定义
////////////////////////////////////////////////////////
class Decimal
{
private:
int* A;
//存放每位数的数组
int
L;
//数的位数
int currentL;
//当前数的位数
public:
Decimal(int l=100)
//空构造函数
{L=l;A=new int[L];currentL=0;setZero();};
Decimal(char* s,int L);//带参数的构造函数
~Decimal()
//析构函数
{delete [] A;};
void setZero()
//置零函数
{for(int i=0;i<L;i++)A[i]=0;};
//友元重载输出运算符
friend ostream& operator<<(ostream& os,Decimal& R);
//友元重载输入运算符
friend istream& operator>>(istream& is,Decimal& R);
//友元重载+运算符
friend Decimal operator+(Decimal& A,Decimal& B);
};
///////////////////////////////////////Decimal类声明结束
////////////////////////////////////////////////////////
//带参数的构造函数
////////////////////////////////////////////////////////
Decimal::Decimal(char* s,int l)
{
L=l;
//开辟内存
A=new int[L];
//所有位置零
setZero();
//把s里的数字内容放入堆栈
int i=0;
LinkedStack<char> LS;
while(s[i]!='#')
{
LS.Push(s[i]);
i++;
}
//在把堆栈里的内容放入数组A
char temp;i=0;
while(!LS.IsEmpty())
{
LS.Pop(temp);
A[i]=int(temp)-48;
i++;
};
//置当前长度
currentL=i;
};
////////////////////////////////////////////构造函数结束
////////////////////////////////////////////////////////
//友元重载输出运算符
////////////////////////////////////////////////////////
ostream& operator<<(ostream& os,Decimal& R)
{
//显示该数
for(int i=R.currentL-1;i>=0;i--)
os<<R.A[i];
return os;
};
//////////////////////////////////////////////<<重载结束
////////////////////////////////////////////////////////
//友元重载输入运算符
////////////////////////////////////////////////////////
istream& operator>>(istream& is,Decimal& R)
{
char* s=new char[R.L];
is>>s;
//把s里的数字内容放入堆栈
int i=0;
LinkedStack<char> LS;
while(s[i]!='#')
{
LS.Push(s[i]);
i++;
};
//在把堆栈里的内容放入数组A
char temp;i=0;
while(!LS.IsEmpty())
{
LS.Pop(temp);
R.A[i]=int(temp)-48;
i++;
};
//置当前长度
R.currentL=i;
return is;
};
//////////////////////////////////////////////>>重载结束
#endif