刷题OJ 网站!验证你的代码是否正确!!!
高精度除法(除低精度)
1.思想:
逐位计算: 从高位到低位,依次对每个小段进行除法运算。首先将前面的余数乘以基数,然后加上当前小段的值,再进行除法运算,得到商和新的余数。重复步骤: 将得到的商作为结果的一部分,并将新的余数作为下一次计算的余数。重复以上步骤,直到所有小段都被处理完毕。
由上图可看,首先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]
}
怎么得出整数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;
}