伊莉討論區
標題:
大數運算
[打印本頁]
作者:
playsp
時間:
2012-4-19 06:28 PM
標題:
大數運算
題目要求我們使用運算子多載進行大數運算,目前只有做出了加法
剩下的減乘除想不出來.......請各位幫幫忙
首先是header
#ifndef HUGEINT_H
#define HUGEINT_H
#include <iostream>
#include <string>
using namespace std;
class HugeInt
{
friend ostream &operator<<( ostream &, const HugeInt &);
public:
static const int digits=30;
HugeInt( long = 0 );
HugeInt( const string & );
HugeInt operator+( const HugeInt &) const;
HugeInt operator+( int )const;
HugeInt operator+( const string &) const;
private:
short integer[ digits ];
};
#endif
複製代碼
再來是主程式碼
#include <cctype>
#include "Hugeint.h"
using namespace std;
HugeInt::HugeInt( long value )
{
for( int i=0; i<digits; i++)
integer[ i ]=0;
for( int j = digits-1; value != 0 && j >= 0; j--)
{
integer[j]=value%10;
value /=10;
}
}
HugeInt::HugeInt( const string &number )
{
for( int i=0; i<digits; i++)
integer[ i ]=0;
int length = number.size();
for( int j = digits - length, k = 0; j<digits; j++, k++ )
if( isdigit( number[ k ] ) )
integer[ j ] = number[ k ] - '0';
}
HugeInt HugeInt::operator+( const HugeInt &op2) const
{
HugeInt temp;
int carry=0;
for( int i = digits-1; i >= 0; i--)
{
temp.integer[ i ] = integer[ i ] + op2.integer[ i ] + carry;
if( temp.integer[ i ] > 9 )
{
temp.integer[ i ] %=10;
carry=1;
}
else
carry=0;
}
return temp;
}
HugeInt HugeInt::operator+( int op2 )const
{
return *this + HugeInt( op2 );
}
HugeInt HugeInt::operator+( const string &op2 )const
{
return *this + HugeInt( op2 );
}
ostream& operator<<( ostream &output, const HugeInt &num )
{
int i;
for( i=0; ( num.integer[ i ] == 0 ) && ( i <= HugeInt::digits ); i++ )
;
if( i== HugeInt::digits )
output << 0;
else
for( ; i < HugeInt::digits; i++ )
output << num.integer[ i ];
return output;
}
int main()
{
HugeInt n1( 7654321 );
HugeInt n2( 7891234 );
HugeInt n3( "99999999999999999999999999999" );
HugeInt n4( "1" );
HugeInt n5;
cout << "n1 is " << n1 << "\nn2 is " << n2 << "\nn3 is " << n3 << "\nn4 is " << n4 << "\nn5 is " << n5 << "\n\n";
n5= n1 + n2;
cout << n1 << "+" << n2 << "=" << n5 << "\n\n";
cout << n3 << "+" << n4 << "=" << ( n3 + n4 ) << "\n\n";
n5 = n1 + 9;
cout << n1 << "+" << 9 << "=" << n5 << "\n\n";
n5 = n2 + "10000";
cout << n2 << "+" << "10000" << "=" << n5 <<"\n" << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
複製代碼
作者:
include
時間:
2012-4-20 08:37 AM
再多載一個'-'負號的運算子
a-b就做a+(-b)的運算
a*b就是做a+a做b次
a/b就是a-b做n次
作者:
jehovahcloud
時間:
2012-4-30 07:58 PM
乘法的部分直接成就好囉~反正你都是用short~把進位的部分記下來就可以了,減法也差不多。
作者:
chimark777
時間:
2012-4-30 10:56 PM
參考
http://caterpillar.onlyfun.net/G ... ossip/BigNumber.htm
作者:
orsinobbb
時間:
2012-5-15 03:11 PM
以進位變數 來解決進位問題
-減法的退位也是,
*乘法的部分提供一個想法,
a*b中 a的第n位與b的第m位相乘的結果放入 c的第n+m位內累加
待a與b的每一個位數都相乘過後 ,將c做一次總進位。
這樣的速度較快c的長度 可以是a的長度+b的長度
/除法請利用進位變數做長除法,也可以偷懶呼叫乘法來逼近答案喔!
以上僅提供個人相法
歡迎光臨 伊莉討論區 (http://a401.file-static.com/)
Powered by Discuz!