您的位置:首页 > 其它

大整数模拟

2013-03-30 22:22 134 查看
大整数模拟,很常用,记录下。


1. 加法模拟:
string res,a,b;
res = a + b
string &_string_add_string(const string &a, const string &b, string &res)
{
int sum_value = 0, add_bit = 0;
const int alen = a.length(), blen = b.length();
res = "0" + (alen > blen ? a : b);
for (int i = alen-1, j = blen-1, k = res.length() - 1;
i >= 0 || j >= 0 || add_bit > 0;
--i, --j, --k){
sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;
add_bit = sum_value / 10;
res[k] = sum_value%10 + '0';
}
if (res[0] == '0') res = res.substr(1, res.length() - 1);
return res;
}
2. 减法:

void sub(char *szLine1, char *szLine2, int nLen1, int nLen2)
{
int i , j = 0;
for( i = nLen1 - 1;i >= 0 ; i --)
an1[j++] = szLine1[i] - '0';

j = 0;
for( i = nLen2 - 1;i >= 0 ; i--)
an2[j++] = szLine2[i] - '0';

for( i = 0;i < MAX_LEN ; i ++ )
{
if(an1[i] >= an2[i]) //逐位相减
an1[i] -= an2[i];
else
{
an1[i+1]--;
an1[i] += 10;
an1[i] -= an2[i];
}
}

bool bStartOutput = false;     //此变量用于跳过多余的0
for( i = MAX_LEN; i >= 0; i-- )
{
if( bStartOutput)
printf("%d", an1[i]);  //如果多余的0已经都跳过,则输出
else if( an1[i] ) {
printf("%d", an1[i]);
bStartOutput = true; //碰到第一个非0的值,就说明多余的0已经都跳过
}
}
if(!bStartOutput)      //结果为0特殊处理
printf("0");

}


3.乘法

依赖于加法

string res,a,b;

res = a * b;

和小学生计算乘法的方法一样

string &_del_zeros_before_dot(string &a)
{
if (a.length() <= 0 || a[0] != '0') return a;
int i = 0;
while (i < a.length() && a[i] == '0') ++i;
a = a.substr(i, a.length() - i);
return a;
}

string &_string_add_string(const string &a, const string &b, string &res)
{
int sum_value = 0, add_bit = 0;
const int alen = a.length(), blen = b.length();
res = "0" + (alen > blen ? a : b);
for (int i = alen-1, j = blen-1, k = res.length() - 1;
i >= 0 || j >= 0 || add_bit > 0;
--i, --j, --k){
sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;
add_bit = sum_value / 10;
res[k] = sum_value%10 + '0';
}
if (res[0] == '0') res = res.substr(1, res.length() - 1);
return res;
}

string &_gen_zeros_string(int n, string &res) {
string temp = "0";
res = "";
while (n) {
if (n&1) res += temp;
temp += temp;
n >>= 1;
}
return res;
}

string &_string_multiply_char(
const string &a,
char c, int n_zeros, string &res) {

int ch = c - '0';
string zeros_string;
_gen_zeros_string(n_zeros, zeros_string);
res = "0" + a + zeros_string;

const int alen = a.length();
for (int i = alen - 1, k = alen, add_bit = 0;
i >= 0 || add_bit > 0; --i, --k) {
int v = (i>=0 ? a[i]-48: 0) * ch + add_bit;
add_bit = v / 10;
res[k] = v % 10 + '0';
}
if (res[0] == '0') res = res.substr(1, res.length() - 1);

return res;
}

string &_string_multiply_string(const string &a, const string &b, string &res) {
string c = a, d = b;
_del_zeros_before_dot(c);
_del_zeros_before_dot(d);
int clen = c.length(), dlen = d.length();

if (clen < dlen) {
string t = c; c = d; d = t;
int x = clen; clen = dlen; dlen = x;
}

res = "0";
for (int i = dlen - 1; i >= 0; --i) {
string temp_res;
_string_multiply_char(c, d[i], (dlen - 1 - i), temp_res);

string add_res;
_string_add_string(res, temp_res, add_res);
res = add_res;
}
return res;
}


4.除法

哥不会,没有好的想法

好像也不常用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大整数 三则运算