伊莉討論區

標題: 大數運算 [打印本頁]

作者: playsp    時間: 2012-4-19 06:28 PM     標題: 大數運算

題目要求我們使用運算子多載進行大數運算,目前只有做出了加法
剩下的減乘除想不出來.......請各位幫幫忙

首先是header
  1. #ifndef HUGEINT_H
  2. #define HUGEINT_H

  3. #include <iostream>
  4. #include <string>
  5. using namespace std;

  6. class HugeInt
  7. {
  8.       friend ostream &operator<<( ostream &, const HugeInt &);
  9. public:
  10.        static const int digits=30;

  11.        HugeInt( long = 0 );
  12.        HugeInt( const string & );
  13.        HugeInt operator+( const HugeInt &) const;
  14.        HugeInt operator+( int )const;
  15.        HugeInt operator+( const string &) const;
  16. private:
  17.         short integer[ digits ];              
  18.       };

  19.       #endif
複製代碼


再來是主程式碼
  1. #include <cctype>
  2. #include "Hugeint.h"
  3. using namespace std;

  4. HugeInt::HugeInt( long value )
  5. {
  6. for( int i=0; i<digits; i++)
  7.       integer[ i ]=0;
  8. for( int j = digits-1; value != 0 && j >= 0; j--)
  9. {
  10.       integer[j]=value%10;
  11.       value /=10;
  12.       }
  13.                   }

  14. HugeInt::HugeInt( const string &number )
  15. {
  16. for( int i=0; i<digits; i++)
  17.       integer[ i ]=0;
  18. int length = number.size();

  19. for( int j = digits - length, k = 0; j<digits; j++, k++ )
  20.       if( isdigit( number[ k ] ) )
  21.           integer[ j ] = number[ k ] - '0';
  22.                   }

  23. HugeInt HugeInt::operator+( const HugeInt &op2) const
  24. {
  25. HugeInt temp;
  26. int carry=0;

  27. for( int i = digits-1; i >= 0; i--)
  28. {
  29.       temp.integer[ i ] = integer[ i ] + op2.integer[ i ] + carry;

  30.       if( temp.integer[ i ] > 9 )
  31.       {
  32.           temp.integer[ i ] %=10;
  33.           carry=1;
  34.           }
  35.       else
  36.           carry=0;
  37.       }
  38.       return temp;
  39.        }

  40. HugeInt HugeInt::operator+( int op2 )const
  41. {
  42.         return *this + HugeInt( op2 );
  43.         }

  44. HugeInt HugeInt::operator+( const string &op2 )const
  45. {
  46.         return *this + HugeInt( op2 );
  47.         }

  48. ostream& operator<<( ostream &output, const HugeInt &num )
  49. {
  50. int i;
  51. for( i=0; ( num.integer[ i ] == 0 ) && ( i <= HugeInt::digits ); i++ )
  52.       ;
  53. if( i== HugeInt::digits )
  54.      output << 0;
  55. else
  56.      for( ; i < HugeInt::digits; i++ )
  57.           output << num.integer[ i ];

  58.           return output;
  59.           }
  60. int main()
  61. {
  62.     HugeInt n1( 7654321 );
  63.     HugeInt n2( 7891234 );
  64.     HugeInt n3( "99999999999999999999999999999" );
  65.     HugeInt n4( "1" );
  66.     HugeInt n5;

  67.     cout << "n1 is " << n1 << "\nn2 is " << n2  << "\nn3 is " << n3 << "\nn4 is " << n4 << "\nn5 is " << n5 << "\n\n";

  68.     n5= n1 + n2;
  69.     cout << n1 << "+" << n2 << "=" << n5 << "\n\n";

  70.     cout << n3 << "+" << n4 << "=" << ( n3 + n4 ) << "\n\n";

  71.     n5 = n1 + 9;
  72.     cout << n1 << "+" << 9 << "=" << n5 << "\n\n";

  73.     n5 = n2 + "10000";
  74.     cout << n2 << "+" << "10000" << "=" << n5 <<"\n" << endl;

  75.     system("PAUSE");
  76.     return EXIT_SUCCESS;
  77. }
複製代碼



作者: 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!