基础组芝士大乱炖1——高精运算

1.高精

先讲难的,除法(蒟蒻只会写高精除以低精,555),另外的太煎蛋了,懒得写注释了

#include <iostream>
using namespace std;

const int maxn=10010;
int a[maxn],c[maxn];
int main(){
    string s; // 被除数
    long long b,x=0; // 除数,累加余数时要乘以10,不能定义为int类型
    cin>>s>>b;
    int n=s.length();
    for(int i=0;i<n;i++) // 将第1个字符串存储在数组中,正序存储
        a[i+1]=s[i]-'0';
    for(int i=1;i<=n;i++){ // 除法运算
        x=x*10+a[i]; // 累加上次的余数和当前位
        c[i]=x/b; // 记录商
        x%=b; // 更新余数
    }
    int lenc=1;
    while(c[lenc]==0&&lenc<n) lenc++; // 删除前导0
    for(int i=lenc;i<=n;i++) // 从高位到低位依次输出答案
        cout<<c[i];
    cout<<endl<<x; //输出余数
    return 0;
}

乘法(这个会写高精,喜)

#include<bits/stdc++.h>

using namespace std;

int x[1001] = {0},y[1001] = {0},z[10002] = {0},len;
string a,b;


int main()
{
	cin>>a>>b;
	if(a == "0" || b == "0")
	{
		cout<< 0 ;
		return 0;
	}
	for(int i = 0;i < a.size();i++)
	{
		x[a.size()-1-i] = a[i] - '0';
	}
	for(int i = 0;i < b.size();i++)
	{
		y[b.size()-1-i] = b[i] - '0';
	}	
	for(int i = 0;i < a.size();i++)
	{
		for(int j = 0;j <b.size();j++)
		{
			z[i+j] += x[i] * y[j];
			if(z[i+j] > 9)
			{
				z[i+j+1] += z[i+j] / 10;
				z[i+j] %= 10;
			}
		}
		
	}
	len = a.size() + b.size();
	if(z[len-1] == 0)	len--;
	for(int i = len-1;i >= 0;i--)	cout<<z[i];
	return 0;
}

加法

#include<bits/stdc++.h>

using namespace std;

string a,b;
int x[1001] = {0},y[1001] = {0},z[1002] = {0},len;

int main()
{
	cin>>a>>b;
	for(int i = 0;i < a.size();i++)
	{
		x[a.size()-1-i] = a[i] - '0';
	}
	for(int i = 0;i < b.size();i++)
	{
		y[b.size()-1-i] = b[i] - '0';
	}
	len = max(a.size(),b.size());
	
	for(int i = 0;i < len;i++)
	{
		z[i] += x[i] + y[i];
		if(z[i] > 9)
		{
			z[i+1] += 1;
			z[i] -= 10;
		}
	}
	if(z[len])	len++;
	for(int i = len-1;i >= 0;i--)	cout<<z[i];
	return 0;
}

减法

#include<bits/stdc++.h>

using namespace std;

string a,b;
int x[1001] = {0},y[1001] = {0},z[1002] = {0},len;

int main()
{
	cin>>a>>b;
	if(a.size()<b.size() ||(a < b && a.size() == b.size()))
	{
		cout<<'-';
		swap(a,b);
	}
	for(int i = 0;i < a.size();i++)
	{
		x[a.size()-1-i] = a[i] - '0';
	}
	for(int i = 0;i < b.size();i++)
	{
		y[b.size()-1-i] = b[i] - '0';
	}
	len = max(a.size(),b.size());
	
	for(int i = 0;i < len-1;i++)
	{
		z[i] += x[i] - y[i];
		if(z[i] < 0)
		{
			z[i+1] -= 1;
			z[i] += 10;
		}
	}
	z[len-1] += x[len-1] - y[len-1];
	while(z[len-1]==0 && len > 1)
	{
		len--;
	}
	for(int i = len-1;i >= 0;i--)
	{
		cout<<z[i];
	}	
	return 0;
}

哎呀,22:15了,先洗洗睡了,未完待续。
OK,9:45了,继续更新

1 个赞

把这种类型放到经验分享区

OK,thanks