您的位置:首页 > 编程语言 > C语言/C++

大整数高精度加减乘除

2017-02-27 15:01 267 查看
#include<cstdio>
#include<cstring>
struct bign
{
int d[1000];
int len;
bign()
{
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char str[])//将整数转换为bign
{
bign a;
a.len = strlen(str);//bign的长度就是字符串的长度
for (int i = 0; i < a.len; i++)
{
a.d[i] = str[a.len - i - 1] - '0';//逆着赋值
}
return a;
}
int compare(bign a, bign b)//比较a和b大小,a大、相等、a小分别返回1、0、-1
{
if (a.len > b.len)return 1;//a大
else if (a.len < b.len)return -1;//a小
else
{
for (int i = a.len - 1; i >= 0; i--)//从高位往低位比较
{
if (a.d[i] > b.d[i])return 1;//只要有一位a大,则a大
else if (a.d[i] < b.d[i])return -1;//只要有一位a小,则a小
}
return 0;//两数相等
}
}
bign add(bign a, bign b)//高精度a+b
{
bign c;
int carry = 0;//carry是进位
for (int i = 0; i < a.len || i < b.len; i++)//以较长的为界限
{
int temp = a.d[i] + b.d[i] + carry;//两个对应位与进位相加
c.d[c.len++] = temp % 10;//个位数为该位结果
carry = temp / 10;//十位数为新的进位
}
if (carry != 0)//如果最后进位不为0,则直接赋给结果的最高位
{
c.d[c.len++] = carry;
}
return c;
}
bign sub(bign a, bign b)//高精度a-b
{
bign c;
for (int i = 0; i < a.len || i < b.len; i++)//以较长的为界限
{
if (a.d[i] < b.d[i])//如果不够减
{
a.d[i + 1]--;//向高位借位
a.d[i] += 10;//当前位加10
}
c.d[c.len++] = a.d[i] - b.d[i];//减法结果为当前位结果
}
while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
{
c.len--;//去除高位的0,同时至少保留一位最低位
}
return c;
}
bign multi(bign a, int b)//高精度乘法
{
bign c;
int carry = 0;//进位
for (int i = 0; i < a.len; i++)
{
int temp = a.d[i] * b + carry;
c.d[c.len++] = temp % 10;//个位作为该位结果
carry = temp / 10;//高位部分作为新的进位
}
while (carry != 0)//和加法不一样,乘法的进位可能不止一位,因此用while
{
c.d[c.len++] = carry % 10;
carry /= 10;
}
return c;
}
bign divide(bign a, int b, int &r)//高精度除法,r为余数
{
bign c;
c.len = a.len;//被除数的每一位和商的每一位是一一对应的,因此先令长度相等
for (int i = a.len - 1; i >= 0; i--)//从高位开始
{
r = r * 10 + a.d[i];//和上一位遗留的余数组合
if (r < b)c.d[i] = 0;//不够除,该位为0
else//够除
{
c.d[i] = r / b;//商
r = r%b;//获得新的余数
}
}
while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
{
c.len--;//去除高位的0,同时至少保留一位最低位
}
return c;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 算法