高精加减乘除的主体简单记忆

首先我们得知道
我们是所以用字符串而非数字是因为他可以直接求-----数组长度
我们也可以不用字符串输入—只要你有需求且会用其他方法求数组长度

还有一个东西就是求数的长度嘛,如果我们所输入的数字是大于该类型的长度(例如 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值