大整數除法

來源:互聯網
上載者:User

//得到商和餘數版本:

1,大整數除法運算,不同於其它的大整數運算,它不需要對字串進行逆轉,這主要是因為大整數除法是類比手算過程,從最高位開始試商。

2,試商的過程是調用大整數減法和比較函數的過程,這裡的減法運算只實現大數減小數的情形。

3,被除數為m位,除數為n位,則商最多為m位,餘數最多為n位。

4,strcmp("2","123") 結果為1,所以這裡必須重新寫一個比較函數

//商和餘數版本一

#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 10

bool NotZero(char ch)
{
 return ch != '0';
}

int Cmp(char res[MAX][MAX],char right[MAX])
{
 int i,len1,len2;
 len1 = strlen(res[1]);
 len2 = strlen(right);

 if(len1 < len2)
  return -1;
 else if(len1 > len2)
  return 1;
 else
 {
  for(i = 0;i < len1 && res[1][i] == right[i];++i);
  if(i == len1)
   return 0;
  else if(res[1][i] > right[i])
   return 1;
  else
   return -1;
 }
}

void Sub(char res[MAX][MAX],char right[MAX])
{
 int i,len1,len2;
 len1 = strlen(res[1]);
 len2 = strlen(right);
 
 reverse(res[1],res[1] + len1);
 reverse(right,right + len2);

 for(i = 0;i < len1;++i)
  res[1][i] -= '0';

 for(i = 0;i < len1;++i)
 {
  if(i < len2)
  {
   res[1][i] = res[1][i] - right[i] + '0';
   if(res[1][i] < 0)
   {
    res[1][i] = res[1][i] + 10;
    --res[1][i+1];
   }
  }
  else
  {
   if(res[1][i] < 0)
   {
    res[1][i] = res[1][i] + 10;
    --res[1][i+1];
   }
  }
 }

 while(len1 > 1 && res[1][len1-1] == 0)
  --len1;

 for(i = 0;i < len1;++i)
  res[1][i] += '0';
 res[1][len1] = '/0';

 reverse(res[1],res[1] + len1);
 reverse(right,right + len2);
}

void Div(char left[MAX],char right[MAX],char res[2][MAX])
{
 int i,j,r,len1,len2;
 len1 = strlen(left);
 len2 = strlen(right);

 for(i = 0;i <= len1;++i)//將商的各位歸零,同時將結束符加進去
  res[0][i] = 0;

 for(i = 0;i <= len1;++i)//將餘數的各位歸零,同時將結束符加進去,這裡之所以用len1,不用len2是因為餘數的中間結果可能等於被除數的位元
  res[1][i] = 0;

 for(i = 0,j = 0;i < len1;++i)
 {
  r = 0;
  res[1][j] = left[i];
  while(Cmp(res,right) >= 0)
  {
   ++r;
   Sub(res,right);//這裡的減法運算不會引入前置0
  }
  if(Cmp(res,"0") != 0)

   j = strlen(res[1]);
  else//當減的結果為0時,必須將j設定為0,否則隨著前置0的增多影響Cmp的正確判斷
   j = 0;

  res[0][i] = r + '0';
 }

 len1 = strlen(res[0]);
 char* pos = find_if(res[0],res[0] + len1 - 1,NotZero);//在保留一位的範圍內找第一個不為0的元素
 copy(pos,res[0] + len1 + 1,res[0]);//+1將字串結束符也移動的指定位置
}

int main()
{
 char left[MAX],right[MAX],res[2][MAX];

 while(cin >> left >> right)
 {
  Div(left,right,res);
  cout << res[0] << endl;
  cout << res[1] << endl;
 }
 return 0;
}

 

//商和餘數版本二

#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 10

bool NotZero(char ch)
{
 return ch != '0';
}

int Cmp(char* rm,char* rt)
{
 int i,len1,len2;
 len1 = strlen(rm);
 len2 = strlen(rt);

 if(len1 < len2)
  return -1;
 else if(len1 > len2)
  return 1;
 else
 {
  for(i = 0;i < len1 && rm[i] == rt[i];++i);
  if(i == len1)
   return 0;
  else if(rm[i] > rt[i])
   return 1;
  else
   return -1;
 }
}

void Sub(char* rm,char* rt)
{
 int i,len1,len2;
 len1 = strlen(rm);
 len2 = strlen(rt);

 reverse(rm,rm + len1);
 reverse(rt,rt + len2);

 for(i = 0;i < len1;++i)
  rm[i] -= '0';

 for(i = 0;i < len1;++i)
 {
  if(i < len2)
  {
   rm[i] = rm[i] - rt[i] + '0';
   if(rm[i] < 0)
   {
    rm[i] += 10;
    --rm[i+1];
   }
  }
  else
  {
   if(rm[i] < 0)
   {
    rm[i] += 10;
    --rm[i+1];
   }
  }
 }

 while(len1 > 1 && rm[len1 - 1] == 0)
  --len1;

 for(i = 0;i < len1;++i)
  rm[i] += '0';
 rm[len1] = '/0';

 reverse(rm,rm + len1);
 reverse(rt,rt + len2);
}

void Div(char* left,char* right,char res[2][MAX])
{
 int i,j,r,len1,len2;
 len1 = strlen(left);
 len2 = strlen(right);

 for(i = 0;i <= len1;++i)
  res[0][i] = res[1][i] = 0;

 for(i = 0,j = 0;i < len1;++i)
 {
  r = 0;
  res[1][j] = left[i];
  while(Cmp(res[1],right) >= 0)
  {
   Sub(res[1],right);
   ++r;
  }

  if(Cmp(res[1],"0") == 0)
   j = 0;
  else
   j = strlen(res[1]);
  res[0][i] = r + '0';
 }
 
 len1 = strlen(res[0]);
 char* pos = find_if(res[0],res[0] + len1 - 1,NotZero);
 copy(pos,res[0] + len1 + 1,res[0]);
}

int main()
{
 char left[MAX],right[MAX],res[2][MAX];

 while(cin >> left >> right)
 {
  Div(left,right,res);
  cout << res[0] << endl;
  cout << res[1] << endl;
 }
 return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.