(整型)大数乘法
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
int main()
{
string a, b;
int C[256],num,p,q,t = 0,temp,k;
//num 进数 p q 暂时存放用来相乘的数(也就是某个位上的数) t,k k是存放结果的下标
//t是存放结果下标的起始位置 为了符合乘法 需要将 t递增(每次一个位上的数乘完大数后)
cin >> a >> b;
//存放结果 先初始化为0
memset(C, 0, 256);
for (int i = a.size() - 1; i >= 0; --i)
{
if (a[i] == '-' || a[i] == '+')
{
break; //如果a[i] 已经是 '-'或者 '+'则不必计算
}
p = a[i] - '0'; //存放位上的数据
num = 0; //初始化进数为 0
k = t; //初始化起始位置
for (int j = b.size() - 1; j >= 0; --j)
{
if (b[j] == '-' || b[j] == '+')
{
break;
}
q = b[j] - '0';
temp = p * q + num + C[k]; //乘积+进数+本位上原来的数
C[k] = temp % 10; //对数取模才是 留在该位的数
num = temp / 10; //进数
++k;
}
C[k] = num; //将剩余的数 存放在下一位
++t;
}
if ((a[0] == '-'&& b[0] != '-')||(a[0] != '-' && b[0] == '-'))
{
printf("-");
}
for (int i = k; i >= 0; --i) //排除掉前导 0
{
if (C[i] != 0 || i == 0)
{
k = i;
break;
}
}
//输出结果
for (int i = k; i >= 0; --i)
{
printf("%d", C[i]);
}
return 0;
}
大数除法(1) 高精度除以低精度
#include<string>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
string a;
int Sum[256], b,x = 0; //Sum 存放结果 b 低精度的除数 x是余数
memset(Sum, 0, 256); // 初始化为0
cin >> a >> b;
//除法 每个位上的数都对除数相除
for (int i = 0; i < a.size(); ++i)
{
Sum[i] = (x * 10 + (a[i] - '0')) / b;//余数乘以10加上本位的数除以b
x = (x * 10 + (a[i] - '0')) % b; // 余数
}
int lena = 0;
//去除前导0
while (Sum[lena] == 0 && lena < a.size()-1)
{
++lena;
}
//输出商 与 余数
cout << "商:";
for (int i = lena; i < a.size(); ++i)
{
printf("%d",Sum[i]);
}
cout << " 余:";
printf("%d", x);
return 0;
}
大数除法 高精度除以高精度
高精除以低精度是对被除数的每一位(这里
的“一位”包含前面的余数,以下都是如此)
都除以除数,而高精除以高精则是用减法模拟
除法,对被除数的每一位都减去除数,一直减到当前位置的数字(包含前面的余数)
小于除数(由于每一位的数字小于10,所以
对于每一位最多进行10次计算)具体实现程序如下:
#include<iostream>
#include<string>
using namespace std;
int a[101], b[101], c[101], d, i;
//输入大数
void inString(int a[])
{
string s;
cin >> s;
a[0] = s.size(); //存储位数大小
for (i = 1; i <= a[0]; i++) //倒序存数
{
a[i] = s[a[0] - i] - '0';
}
}
void print(int a[]) //数据打印
{
if (a[0] == 0) { cout << 0 << endl; return; }//位数w为0 则输出0
for (int i = a[0]; i > 0; i--) cout << a[i]; //不为0 则慢慢输出数据
cout << endl;
return;
}
int compare(int a[], int b[]) //比较两个数
{
int i;
//首先看位数 位数大的大 相同的话 一位位比下去
if (a[0] > b[0]) return 1;
if (a[0] < b[0]) return -1;
for ( i = a[0]; i > 0; i--)
{
if (a[i] > b[i]) return 1;
if (a[i] < b[i]) return -1;
}
return 0;
}
void numpcpy(int p[], int q[], int det) //复制p数组到q数组从det开始的地方
{
//是用于除法在进行减法时进行整体的移位处理
for (int i = 1; i <= p[0]; i++) { q[i + det - 1] = p[i]; }
//改变数组的位数
q[0] = p[0] + det - 1;
}
void jian(int a[], int b[])
{
int flag, i;
flag = compare(a, b); //比较谁大
if (flag == 0) { a[0] = 0; return; } //表明a是减完了
if (flag == 1) //a比b大 可以进行减法
{
for (i = 1; i <= a[0]; ++i)
{
if (a[i] < b[i]) { --a[i + 1]; a[i] += 10; }
a[i] -= b[i];
}
while (a[0] > 0 && a[a[0]] == 0) a[0]--; //修正a的位数 如果他的最高项是0的
}
}
void chugao(int a[], int b[], int c[])
{
int temp[101];
c[0] = a[0] - b[0] + 1; //这是用来判断 a与b相差了多少位 然后移动b的位数 从高位减起 记住 高位是在后面的
for (int i = c[0]; i > 0; i--)
{
memset(temp, 0, 101);
numpcpy(b, temp, i); //对数组进行移位
while (compare(a, temp) >= 0)
{
//a大于temp 所以可以减 所以可以递增一次商
c[i]++;
jian(a, temp);
}
}
while (c[0] > 0 && c[c[0]] == 0)c[0]--;//删除前导的0
return;
}
int main()
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
inString(a), inString(b);
chugao(a, b, c);
print(c);
print(a);
return 0;
}