一.原理
其实就和我们小学时做除法时一样,进行模拟就行了。从高位往低位试着除。(详细见代码注释)
二.不同点
这是唯一一个不用倒叙,正序相除的高精度算法,所以处理首位0的时候也要注意啦!
三.代码
1.核心代码
int x=0; //借位
for(int i=0;i<len;i++){
c[i]=(a[i]+x*10)/b;
x=(a[i]+x*10)%b;
}
int lenc=0;
while(lenc<len &&c[lenc]==0) lenc++;
2.函数
void division(char a1[],int b){
int a[1001]={}; //除数
int c[1001]={}; //商
int len=strlen(a1);
for(int i=0;i<len;i++){
a[i]=a1[i]-'0'; //四个高精度运算唯一不用倒过来的
}
int x=0; //借位
for(int i=0;i<len;i++){
c[i]=(a[i]+x*10)/b;
x=(a[i]+x*10)%b;
}
int lenc=0;
while(lenc<len &&c[lenc]==0) lenc++;
for(int i=lenc;i<len;i++){
cout<<c[i];
}
}
3.题目
题目描述:
给定一个高精度数a和b,输出它们的合
样例一:
输入:999999999
3
输出:333333333
样例二
输入:122200000000
20
输出:6110000000
4.答案
#include<iostream>
#include<cstring>
using namespace std;
void division(char a1[],int b){
int a[1001]={}; //除数
int c[1001]={}; //商
int len=strlen(a1);
for(int i=0;i<len;i++){
a[i]=a1[i]-'0'; //四个高精度运算唯一不用倒过来的
}
int x=0; //借位
for(int i=0;i<len;i++){
c[i]=(a[i]+x*10)/b;
x=(a[i]+x*10)%b;
}
int lenc=0;
while(lenc<len &&c[lenc]==0) lenc++;
for(int i=lenc;i<len;i++){
cout<<c[i];
}
}
int main(){
char a[1001]={};
int b;
cin>>a>>b;
division(a,b);
return 0;
}
四.总结
高精度运算系列就到此为止了,NOI大纲上也只要求这些:高加,高减,高乘,高除低。具体见往期内容,感谢大家阅读,下期更精彩。