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

两个任意大的数相乘,怎么设计数据结构

2012-02-26 
两个任意大的数相乘,如何设计数据结构给出一种整数的表示,它适合于对任意大的整数进行算术运算,而且结果没

两个任意大的数相乘,如何设计数据结构
给出一种整数的表示,它适合于对任意大的整数进行算术运算,而且结果没有精度的损失。使用C++来实现它的加减乘除。大家看怎么做呀?

[解决办法]
- -
[解决办法]
我也是新手,给你发个自己写的,凑合着用吧。。
#include <iostream>
#include <string>
using namespace std;
#define P true
#define N false

class BigInt{
friend ostream & operator < < (ostream & ,BigInt &);
friend istream & operator > > (istream & ,BigInt &);
public:
BigInt(string num = "0 "){
len = (int)num.length();
if(num[0] == '- '){
flag = N;len --;
bignum = new int [len];
for(int i = 0;i < len;i ++)
bignum[i] = num[len - i] - 48;
}
else{
flag = P;
bignum = new int [len];
for(int i = 0;i < len;i ++)
bignum[i] = num[len - 1 - i] - 48;
}
}
~BigInt() {
delete [] bignum;
}
int lenth(){
return len;
}

bool operator > (BigInt &);
bool operator > = (BigInt &);
bool operator < (BigInt &);
bool operator <= (BigInt &);
bool operator == (BigInt &);
bool operator != (BigInt &);
void operator = (BigInt &);

BigInt operator + (BigInt &);
BigInt operator - (BigInt &);
BigInt operator * (BigInt &);
BigInt operator * (int);
BigInt operator / (BigInt &);
BigInt operator % (BigInt &);

BigInt operator ++ (int); //postfix
BigInt & operator ++ (); //prefix
BigInt operator -- (int); //postfix
BigInt & operator -- (); //prefix

BigInt & operator += (BigInt &);
BigInt & operator -= (BigInt &);
BigInt & operator *= (BigInt &);
BigInt & operator /= (BigInt &);

private:
int * bignum;
int len;
bool flag;

void CutZero(){
while(bignum[len - 1] == 0 && len > 1)
len --;
}

BigInt GetRemain (BigInt & b){
BigInt * remain = new BigInt;
if(*this < b){
*remain = b;
remain-> flag = P;
}
if( *this == b ){
remain-> bignum = new int [1];
remain-> bignum[0] = 0;
remain-> len = 1;
remain-> flag = P;
}
if( *this > b ){
BigInt tmpResult;
int tryroot = 1;
while(true){
tmpResult = b * tryroot;
tryroot ++;
if(tmpResult > = *this) break;
}
if( tmpResult == *this ){
remain-> bignum = new int [1];
remain-> bignum[0] = 0;
remain-> len = 1;
remain-> flag = P;
}
else *remain = *this - b * (tryroot - 2);
}
(*remain).CutZero();
return *remain;
}


int GetQuotient(BigInt & b){
if(*this < b) return 0;
else{
if( *this == b ){
return 1;
}
else{
BigInt tmpResult;
int tryroot = 1;
while(true){
tmpResult = b * tryroot;
tryroot ++;
if(tmpResult > = *this) break;
}
if( tmpResult == *this )
return tryroot - 1;
else
return tryroot - 2;
}
}
return 0;
}


BigInt CopyThe (int n){
BigInt * result = new BigInt;
result-> len = 1;
result-> bignum = new int [1];
result-> flag = P;
result-> bignum[0] = this-> bignum[this-> len - n];


return *result;
}


BigInt CopyFor (int n){
BigInt * result = new BigInt;
result-> len = n;
result-> bignum = new int [n];
result-> flag = P;
for(int i = 0;i < n;i ++)
result-> bignum[i] = this-> bignum[i + this-> len - n];
return *result;
}


BigInt & AddZero(int ZeroNum){
int * tmp = new int [this-> len];
for(int i = 0;i < this-> len;i ++)
tmp[i] = this-> bignum[i];
delete [] this-> bignum;
this-> bignum = new int [this-> len + ZeroNum];
for(int j = this-> len - 1;j > = 0;j --)
this-> bignum[j + ZeroNum] = tmp[j];
for(int j = 0;j < ZeroNum;j ++)
this-> bignum[j] = 0;
this-> len += ZeroNum;
return *this;
}


};

ostream & operator < < (ostream & out,BigInt &a){
if(a.flag == N) out < < "- ";
a.CutZero();
for(int i = a.len - 1;i > = 0;i --)
out < < a.bignum[i];
return out;
}

istream & operator > > (istream & in,BigInt &a){
string num;
in > > num;
a.len = (int)num.length();
delete [] a.bignum;
if(num[0] == '- '){
a.flag = N; a.len --;
a.bignum = new int [a.len];
for(int i = 0;i < a.len;i ++)
a.bignum[i] = num[a.len - i] - 48;
}
else{
a.flag = P;
a.bignum = new int [a.len];
for(int i = 0;i < a.len;i ++)
a.bignum[i] = num[a.len - 1 - i] - 48;
}
a.CutZero();
return in;
}

bool BigInt::operator > (BigInt &b){
if(this-> flag == P && b.flag == N) return true;
if(this-> flag == N && b.flag == P) return false;
if(this-> flag == P && b.flag == P){
if(this-> len > b.len)
return true;
else{
if(this-> len < b.len )
return false;
else{
for(int i = this-> len - 1;i > = 0;i --){
if(this-> bignum[i] > b.bignum[i])
return true;
else
{
if(this-> bignum[i] < b.bignum[i])
return false;
}
}
}
}
return false;
}
if(this-> flag == N && b.flag == N){
if(this-> len > b.len)
return false;
else{
if(this-> len < b.len )
return true;
else{
for(int i = this-> len - 1;i > = 0;i --){
if(this-> bignum[i] > b.bignum[i])
return false;
else{
if(this-> bignum[i] < b.bignum[i])
return true;
}
}
}
}
return false;
}
return false;
}

bool BigInt::operator < (BigInt &b){
if(this-> flag == N && b.flag == P) return true;
if(this-> flag == P && b.flag == N) return false;
if(this-> flag == P && b.flag == P){
if(this-> len < b.len)
return true;
else{
if(this-> len > b.len )
return false;
else{
for(int i = this-> len - 1;i > = 0;i --){
if(this-> bignum[i] < b.bignum[i])
return true;
else{
if(this-> bignum[i] > b.bignum[i])
return false;
}
}
}
}
return false;
}
if(this-> flag == N && b.flag == N){
if(this-> len < b.len)
return false;
else{
if(this-> len > b.len )
return true;


else{
for(int i = this-> len - 1;i > = 0;i --){
if(this-> bignum[i] < b.bignum[i])
return false;
else{
if(this-> bignum[i] > b.bignum[i])
return true;
}
}
}
}
return false;
}
return false;
}

bool BigInt::operator <= (BigInt &b){
return !(*this > b);
}

bool BigInt::operator > = (BigInt &b){
return !(*this < b);
}

bool BigInt::operator == (BigInt &b){
return (*this > = b && *this <= b);
}

bool BigInt::operator != (BigInt &b){
return !(*this == b);
}

void BigInt::operator = (BigInt & b){
this-> len = b.len;
this-> flag = b.flag;
delete [] this-> bignum;
this-> bignum = new int [this-> len];
for(int i = 0;i < this-> len;i ++)
this-> bignum[i] = b.bignum[i];
}

BigInt BigInt::operator +(BigInt &b){
BigInt * c = new BigInt;
if((this-> flag == P && b.flag == P) || (this-> flag == N && b.flag == N)){
int * add;
if(this-> flag == P && b.flag == P) c-> flag = P;
else c-> flag = N;
if(this-> len > = b.len){
c-> bignum = new int [this-> len + 1];
c-> len = this-> len + 1;
add = new int [this-> len + 1];
add[0] = 0;
int i = 0;
for(;i < b.len;i ++){
c-> bignum[i] = (this-> bignum[i]+b.bignum[i]+add[i]) % 10;
add[i+1] = (this-> bignum[i]+b.bignum[i]+add[i]) / 10;
}
for(;i < this-> len;i ++){
c-> bignum[i] = (this-> bignum[i]+add[i]) % 10;
add[i+1] = (this-> bignum[i]+add[i]) / 10;
}
c-> bignum[i] = add[i];
}
else{
c-> bignum = new int [b.len + 1];
c-> len = b.len + 1;
add = new int [b.len + 1];
add[0] = 0;
int i = 0;
for(;i < this-> len;i ++){
c-> bignum[i] = (this-> bignum[i]+b.bignum[i]+add[i]) % 10;
add[i+1] = (this-> bignum[i]+b.bignum[i]+add[i]) / 10;
}
for(;i < b.len;i ++){
c-> bignum[i] = (b.bignum[i]+add[i]) % 10;
add[i+1] = (b.bignum[i]+add[i]) / 10;
}
c-> bignum[i] = add[i];
}
delete [] add;
}
else{
if(this-> flag == P && b.flag == N){
BigInt tmp;
tmp = b;
tmp.flag = P;
*c = *this - tmp;
}
else{
BigInt tmp;
tmp = *this;
tmp.flag = P;
*c = b - tmp;
}
}
(*c).CutZero();
return *c;
}

热点排行
Bad Request.