【题目描述】
高精除以高精,求它们的商和余数。
【输入】
输入两个低于300位的正整数。
【输出】
输出商和余数。
【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867 1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590 179780909068307566598992807564736854549985603543237528310337
由于直接写到主函数不太方便,所以我写了几个函数。
高精除高精用到的方法是“用减法模拟除法”。
例如123÷12:
123 | 由于直减了一次,所以最高为是1;
- 120 |
——————
3 | 余数是3;
init()函数:
用于初始化输入的字符数组。
void init(int a[]){
char s1[1001];
cin>>s1;
a[0]=strlen(s1);
for(int i=0;i<a[0];i++){
a[a[0]-i]=s1[i]-'0';
}
}
ifnum函数:
用于判断两个字符串的大小。
int ifnum(int a[],int b[]){
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>=1;i--){
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
sub函数:
用于相减连个字符串。
void sub(int a[],int b[]){
for(int i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[a[0]]==0 && a[0]>0) a[0]--;
}
print函数:
用于输出字符串。
void print(int c[]){
if(c[0]==0){
cout<<0<<endl;
}
for(int i=c[0];i>=1;i--){
cout<<c[i];
}
}
add函数:
用于增位减数,这里比较难理解,需要认真看看。
void add(int a[],int tmp[],int n){
for(int i=1;i<=a[0];i++) tmp[i+n-1]=a[i];
tmp[0]=a[0]+n-1;
}
话不多说,上源代码:
#include<bits/stdc++.h>
using namespace std;
int a[1001],b[1001],c[1001];
void init(int a[]){
char s1[1001];
cin>>s1;
a[0]=strlen(s1);
for(int i=0;i<a[0];i++){
a[a[0]-i]=s1[i]-'0';
}
}
int ifnum(int a[],int b[]){
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>=1;i--){
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
void sub(int a[],int b[]){
for(int i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[a[0]]==0 && a[0]>0) a[0]--;
}
void add(int a[],int tmp[],int n){
for(int i=1;i<=a[0];i++) tmp[i+n-1]=a[i];
tmp[0]=a[0]+n-1;
}
void print(int c[]){
if(c[0]==0){
cout<<0<<endl;
}
for(int i=c[0];i>=1;i--){
cout<<c[i];
}
}
int main(){
init(a);
init(b);
c[0]=a[0]-b[0]+1;
for(int i=c[0];i>=1;i--){
int tmp[1001];
memset(tmp,0,sizeof(tmp));
add(b,tmp,i);
while(ifnum(a,tmp)>=0){
c[i]++;
sub(a,tmp);
}
}
while(c[c[0]]==0 && c[0]>0) c[0]--;
print(c);
cout<<endl;
print(a);
return 0;
}