C++

177 阅读2分钟

刷题OJ 网站!验证你的代码是否正确!!!

高精度除法(除低精度)

1.思想:

逐位计算: 从高位到低位,依次对每个小段进行除法运算。首先将前面的余数乘以基数,然后加上当前小段的值,再进行除法运算,得到商和新的余数。重复步骤: 将得到的商作为结果的一部分,并将新的余数作为下一次计算的余数。重复以上步骤,直到所有小段都被处理完毕。

image.png

由上图可看,首先4跟23相除,也就是最高位除以23。那数组存储的话a[0]就是最高位的。

#include<iostream>
#include<string>
using namespace std;
string s;
int a[1000],b,c[10000],x=0;
int main(){
	cin>>s>>b; 
	int len = s.size(); 
	for(int i=0;i<len;i++){
		a[i] = s[i]-'0'; //最高位存a[0]
	}

image.png

怎么得出整数0,余数4呢?

整数:c[0] = a[0] / b 余数:? = a[0] % b

怎么得出整数1,余数45呢?

整数:c[1] = (a[0]*10+a[1]) / b; 余数:? = (a[0]*10+a[1]) % b;

a[0] * 10 我们可以用 x * 10表示;余数用x表示。

	// 除法
	for(int i=0;i<len;i++){
		c[i] = (x*10+a[i]) / b;
		x = (x*10+a[i]) % b;
	}

这样子c[i] 就存着除法的结果商。例如:4567 / 23 = 0198 … 13 发现数组c的结果有0。如何取出掉呢?在乘法时候我们用len–方式取出,除法的话反过来要 len++;让c数组索引往后挪一位这样就忽略前导0了。

	// 去除前导〇
	int lenc=0;
	while(c[lenc]==0 && lenc<len){
		lenc++;
	}

最后输出,索引开头应该是从lenc开始哟!

	for(int i=lenc;i<len;i++){
		cout<<c[i];
	}

2.高除低完整代码:

#include<iostream>
#include<string>
using namespace std;
string s;
int a[1000],b,c[10000],x=0;
int main(){
	cin>>s>>b;
	int len = s.size(); 
	for(int i=0;i<len;i++){
		a[i] = s[i]-'0';
	}
	for(int i=0;i<len;i++){
		c[i] = (x*10+a[i]) / b;
		x = (x*10+a[i]) % b;
	}
	int lenc=0;
	while(c[lenc]==0 && lenc<len){
		lenc++;
	}
	for(int i=lenc;i<len;i++){
		cout<<c[i];
	}
	return 0;
}

image.png