正文

2进制的高精度加,减和乘法的C++程序2006-10-24 12:24:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/manbuyuduan/19676.html

分享到:

#include <iostream.h>
#include <mem.h>
const int MAXSIZE = 20;     //max length of the number
const int K = 2;             //baniry system 在这里可以修改K进制的高精度
class hp{
   int len;               //length of number
    int s[MAXSIZE];      //store high precistion number
  public:
    hp();
    hp hp::operator = (hp C);
};
hp::hp()
{
 len = 0;
 memset(s, 0, MAXSIZE*sizeof(int));
}
istream &operator >> (istream &in, hp &HP)
{
  char s[MAXSIZE]; 
  int i;  
  cout << "Input Number = ";
  cin >> s;
  HP.len = strlen(s);
  for (i = 0; i < HP.len; i++)
    HP.s[i] = s[HP.len-i-1] - '0'; //change string to high precisition
  return in;
}
ostream &operator << (ostream &out, hp &HP)
{
  int i;
  for (i = HP.len-1; i >= 0; i--)
    cout << HP.s[i];
  return out;
}
hp operator +(hp A, hp B)
{
  int i, len;
  hp C;
  if (A.len > B.len)
    len = A.len;
  else
    len = B.len;           //get the bigger length of A,B
  for (i = 0; i < len; i++){
    C.s[i] += A.s[i] + B.s[i];
    if (C.s[i] >= K){
      C.s[i] -= K;
      ++C.s[i+1];        //add 1 to a higher position
    }
  }
  if (C.s[len] > 0)
    C.len = len+1;
  else
    C.len = len;
  return C;
}
hp operator - (hp A, hp B)  //different of the two HighPrecision Numbers
{
  int len, i;
  hp C;
  if (A.len > B.len)
    len = A.len;
  else
    len = B.len;C.len = 4;
  for (i = 0; i < len; i++){
    C.s[i] += A.s[i] - B.s[i];
    if (C.s[i] < 0){
      C.s[i] += K;
      --C.s[i+1];        //subtract 1 to higher position
    }
  }
  while (C.s[len-1] == 0 && len > 1)
    --len;
  C.len = len;
  return C;
}
hp operator * (const hp &A, const hp &B)
{
  int len, i, j;
  hp C;
  for (i = 0; i < A.len; i++)
    for (j = 0; j < B.len; j++){
      len = i+j;                  
      C.s[len] += A.s[i] * B.s[j];
      C.s[len+1] += C.s[len] / K;
      C.s[len] %= K;
    }
  len = A.len + B.len + 1;   
/* 
the product of a number with i digits and a number with j digits
  can only have at most i+j+1 digits
*/
  while (len > 1 && C.s[len-1] == 0)
    --len;
  C.len = len;
  return C;
}
hp hp::operator = (hp C)
{
  int i;
  len = C.len;
  for (i = 0; i < MAXSIZE; i++)
    s[i] = C.s[i];
  return *this;
}
int main()
{
  hp A, B, C;
  cin >> A >> B;
  C = A+B;
  cout << A << ‘+’ << B << “ = “ << C << endl;
  C = A-B;
  cout << A << ‘-’ << B << “ = “ << C << endl;
  C = A*B;
  cout << A << '*' << B << " = " << C << endl;    
  return 0;  
}

阅读(4752) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册