高精度的加法,减法,乘法,除法
1.char版
高精度的加法:
#include<bits/stdc++.h>//万能头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10010],b[10010],c[10010];//将char型的变成int,存在a,b两个数组里面,c里面用来存储和
char a1[10010],b1[10010];//用于存储输入的两个数组
int i,j;
int main()
{
scanf("%s%s",a1,b1);
int la=strlen(a1),lb=strlen(b1);//获取两个数组的长度
for(int i=0; i<la; i++)
{
a[la-i-1]=a1[i]-48;//倒序存储,便于加减和进借位的处理,48是0
//的ASC||码,将char型变成int型
}
for(int i=0; i<lb; i++)
{
b[lb-i-1]=b1[i]-48;//同上面的处理
}
int m=la>lb?la:lb;//选择长度较大,作为循环的条件
for(i=0; i<m; i++)
{
c[i]+=a[i]+b[i];//C[i]里面可能存储了下一位进位上来的数字,所以是+=,先将右边的a[i]+b[i]
//求出来之后在将相应的进位位加起来。
if(c[i]>=10)
{
c[i+1]++;
c[i]-=10;
}
}
while(c[m]==0&&m>=1)//去除前置0
m--;
for(i=m; i>=0; i--)
printf("%d",c[i]);//逆序输出
return 0;
}
高精度的减法
#include<bits/stdc++.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10010],b[10010],c[10010];
char a1[10010],b1[10010];
int i,j;
int main()
{
scanf("%s%s",a1,b1);
int la=strlen(a1),lb=strlen(b1);
for(int i=0; i<la; i++)
{
a[la-i-1]=a1[i]-48;
}
for(int i=0; i<lb; i++)
{
b[lb-i-1]=b1[i]-48;
}
int m=la>lb?la:lb;
for(i=0; i<m; i++)
{
c[i]+=a[i]-b[i];//现在c[i]里面有从高位借的数字,也要加上现在c[i]里面的数字
if(c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
if(c[i]==-1)//如果最后一位是负数,说明现在的a比b小,可以在一开始就判断,或者像下面处理
{
memset(c,0,sizeof(c));
for(i=0; i<m; i++)
{
c[i]+=b[i]-a[i];
if(c[i]<0)
{
c[i+1]--;
c[i]+=10;
}
}
printf("-");//因为结果位负,所以现在要先打印负号。
}
while(c[m]==0&&m>=1)
m--;
for(i=m; i>=0; i--)
printf("%d",c[i]);//同样道理,判断前置0
return 0;
}
高精度的乘法
#include<bits/stdc++.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10010],b[10010],c[10010];
char a1[10010],b1[10010];
int i,j;
int main()
{
scanf("%s%s",a1,b1);
int la=strlen(a1),lb=strlen(b1);
for(int i=0; i<la; i++)
{
a[la-i-1]=a1[i]-48;
}
for(int i=0; i<lb; i++)
{
b[lb-i-1]=b1[i]-48;
}
int l=la+lb-1;//这里的l用来存储的是两个数相乘的最多的位数
for(i=0; i<la; i++)
{
for(j=0; j<lb; j++)
{
c[i+j]+=a[i]*b[j];//i表示的i+1位,j表示j+1位,所以这里,位数位i+j+2-1=i+j-1
//又因为c数组也是从0开始表示的,所以数组下标位i+j+1-1=i+j;
//同理,c[i+j]里面也可能存储着进位,所以需要加上。
}
}
for(i=0; i<l; i++)
{
if(c[i]>9)
{
c[i+1]+=c[i]/10;//10进制,满10进1
c[i]%=10;//如果由进位,那么该位就是存储mod10的余数。
}
}
while(c[l]==0&&l>=1)
l--;
for(i=l; i>=0; i--)//同理,去除前导0
printf("%d",c[i]);
return 0;
}
2.vector版本
vector<int> mul(vector<int>a, int b)
{
vector<int>c;
int t = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
t += a[i] * b;
c.insert(c.begin(), t % 10);
t = t / 10;
}
if (t > 0)
c.insert(c.begin(), t);
return c;
}
vector<int> div(vector<int>a, int b)
{
vector<int>c;
bool is_first = true;
int t = 0;
int x = 0;
for (int i = 0; i < a.size(); i++)
{
t = t * 10 + a[i];
x = t / b;
if (!is_first || x)
{
c.push_back(x);
is_first = false;
}
t = t % b;
}
return c;
}
vector<int>Plus(vector<int>a, int b)
{
vector<int>c;
int t = b;
if (t == 0) return a;
int i = a.size() - 1;
for (i; i >= 0; i--)
{
t = t + a[i];
c.insert(c.begin(), t % 10);
t = t / 10;
if (t == 0)
break;
}
if (i != -1)
c.insert(c.begin(), a.begin(), a.begin() + i);
else
{
while (t)
{
c.insert(c.begin(), t % 10);
t = t / 10;
}
}
return c;
}
vector<int>reduce(vector<int>a, int b)
{
vector<int>c;
int t = 0;
if (b == 0)
return a;
bool is_true = true;
int i;
int p = 0;
for (i = a.size() - 1; i >= 0; i--)
{
if (is_true == false)break;
t = t + a[i] * pow(10, p);
p++;
if (t > b)
{
c.push_back(t - b);
is_true = false;
}
}
if (i != -1)
c.insert(c.begin(), a.begin(), a.begin() + i + 1);
return c;
}