首先我们得知道
我们是所以用字符串而非数字是因为他可以直接求-----数组长度
我们也可以不用字符串输入—只要你有需求且会用其他方法求数组长度
还有一个东西就是求数的长度嘛,如果我们所输入的数字是大于该类型的长度(例如 int — 十位数)那就行不通要找其他的办法
高精度加法
1.把两个相加的字符串数字-‘0’且进行颠倒
2.求其中最长的那个长度len作为等会处理的工具
3.因为数组已经颠倒了 所以你用加法大于10就向后面的那位进1
4.最后记得把当前数组最后面的0去除掉 我们要倒着输出数字
#include <bits/stdc++.h>
using namespace std;
int len;//len为a,b数组中长的那个
void jf(char a[], char b[])//高精度 X 低精度
{
int alen = strlen(a);
int blen = strlen(b);
//加法要把数组倒过来
for(int i=0; i<alen; i++) a1[i] = a[alen-1-i] - '0';
for(int j=0; j<blen; j++) b1[j] = b[blen-1-j] - '0';
len = alen > blen ? alen : blen;
for(int i=0; i<=len; i++)//len为a,b数组中长的那个
{
int t = a1[i] + b1[i];
a1[i] = t%10;
a1[i+1] = a1[i+1] + t/10;
}
}
int main()
{
scanf("%s", a);
scanf("%s", b);
jf(a, b);
// int t = strlen(a1); 这个不能用,他检测到 /0(%d = 0) 会停
// 现在他们还是颠倒的数字,最前面的数字可能有0哦
while(!a1[len] && len) len--; //把最后的0除去
for(; len>=0; len--)
{
printf("%d", a1[len]);
}
return 0;
}
高精度减法
1.把两个相加的字符串数字-‘0’且进行颠倒
2.求其中最长的那个长度len作为等会处理的工具
3.因为数组已经颠倒了 所以你用减法小于0就向后面的那借1
4.最后记得把当前数组最后面的0去除掉 我们要倒着输出数字
void jf(char a[], charb[])
{
int alen = strlen(a);
int blen = strlen(b);
for(int i=0; i<alen; i++) a1[i] = a[alen-1-i] - '0';
for(int j=0; j<blen; j++) b1[i] = b[blen-1-j] - '0';
int len = alen>blen ? alen:blen;
for(int i=0; i<=len; i++)
{
t = a1[i]-b1[i];
t<0 ? (t+=10, a1[i+1]--):t;
a1[i] = t;
}
}
int main()
{
scanf("%s", a);
scanf("%s", b);
jf(a, b);
while(!a1[len] && len) len--;
for(; len>=0; len--)
{
printf("%d", a1[len]);
}
return 0;
}
高进度乘法
https://blog.csdn.net/Qisi_Li/article/details/113609290
差不多,感觉就 乘法 除法要稍微记下
int i = 0;
void cf(char a[], char b[])
{
int alen = strlen(a);
int blen = strlen(b);
for(int i=0; i<alen; i++) a1[i] = a[alen-1-i] - '0';
for(int j=0; j<blen; j++) b1[i] = b[blen-1-j] - '0';
for(int i=0; i<alen; i++)
for(int j=0; j<blen; j++)
c[i+j] = c[i+j] + a1[i]*b1[j];
for(i=0; i<alen+blen; i++)
if(c[i]>=10)
{
c[i+1] = c[i+1] + c[i] / 10;
c[i] = c[i] % 10;
}
}
int main()
{
scanf("%s", a);
scanf("%s", b);
cf(a, b);
while(!c[i] && i) i--;
for(; i>=0; i--)
{
printf("%d", c[i]);
}
return 0;
}
高精度除法
https://blog.csdn.net/Qisi_Li/article/details/113687242
#include<bits/stdc++.h>
using namespace std;
int c[10000001];//记录结果的数组
string s;
long long k=0,a,b,i;
bool flag;
int main()
{
cin>>s>>b;//输入被除数和除数
for(int i=0;i<s.size();i++)//从高位开始,一位一位向低位
{
a=a*10+s[i]-'0';//加上被除数的这一位
c[k++]=a/b;
a%=b;//除完了
}
for(i=0;i<k;i++)//因为是从高位到低位,所以要反着输出
{
if(c[i]!=0||flag)//防止前导0输出的操作
{
cout<<c[i];
flag=true;
}
}
if(flag==false)cout<<0;//特殊情况:如 0/1 1/100
return 0;
}