//得到商和餘數版本:
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;
}