高精度除法与求余c++版(除数与被除数100000位):
代码如下:
//高精度除法与求余
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int M=1e5+5;
char s[M],result[M];
int main()
{
long long mod,divis;
int n,i,k,flag,len;
while(cin>>s>>n) //输入被除数s以及除数n
{
len=strlen(s);
divis=flag=0;
for(i=k=0; i<len; i++)
{
divis=divis*10+s[i]-'0';
if(divis>=n&&!flag) //利用除法性质,当divs大于除数n时,开始进行整除
{
result[k++]=divis/n+'0';
divis=divis%n; //除法性质,余数*10加下一位的数字便是新的被除数
flag=1;
}
else if(flag)
{
result[k++]=divis/n+'0';
divis=divis%n;
}
}
if(!k) result[k++]='0';
result[k]='\0';
cout<<result<<endl;
mod=0;
for(i=0; i<len; i++)
{
mod=mod*10+s[i]-'0';
mod=mod%n; //利用除法性质,其实质是每次都是一个最多比n多一位的mod对n进行求余
}
cout<<mod<<endl;
}
return 0;
}#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
#define DIGIT 4
#define DEPTH 10000
#define MAX 30000
typedef int bignum_t[MAX+1];
int read(bignum_t a,istream& is=cin){
char buf[MAX*DIGIT+1],ch;
int i,j;
memset((void*)a,0,sizeof(bignum_t));
if (!(is>>buf)) return 0;
for (a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch;
for (a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
for (i=1;i<=a[0];i++)
for (a[i]=0,j=0;j<DIGIT;j++)
a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0';
for (;!a[a[0]]&&a[0]>1;a[0]--);
return 1;
}
void write(const bignum_t a,ostream& os=cout){
int i,j;
for (os<<a[i=a[0]],i--;i;i--)
for (j=DEPTH/10;j;j/=10)
os<<a[i]/j%10;
}
void sub(bignum_t a,const bignum_t b,const int c,const int d){
int i,O=b[0]+d;
for (i=1+d;i<=O;i++)
if ((a[i]-=b[i-d]*c)<0)
a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH;
for (;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
for (;!a[a[0]]&&a[0]>1;a[0]--);
}
int comp(const bignum_t a,const int c,const int d,const bignum_t b){
int i,t=0,O=-DEPTH*2;
if (b[0]-a[0]<d&&c)
return 1;
for (i=b[0];i>d;i--){
t=t*DEPTH+a[i-d]*c-b[i];
if (t>0) return 1;
if (t<O) return 0;
}
for (i=d;i;i--){
t=t*DEPTH-b[i];
if (t>0) return 1;
if (t<O) return 0;
}
return t>0;
}
void div(bignum_t c,bignum_t a,const bignum_t b){
int h,l,m,i;
memset((void*)c,0,sizeof(bignum_t));
c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1;
for (i=c[0];i;sub(a,b,c[i]=m,i-1),i--)
for (h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)
if (comp(b,m,i-1,a)) h=m-1;
else l=m;
for (;!c[c[0]]&&c[0]>1;c[0]--);
c[0]=c[0]>1?c[0]:1;
}
int main()
{
bignum_t a,b,c;
read(a);
read(b);
div(c,a,b);
write(c);
cout<<endl;
write(a);
cout<<endl;
return 0;
} java版:
import java.math.*;
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner cin=new Scanner(System.in);
BigInteger a,b;
while(cin.hasNext()){
a=cin.nextBigInteger();
b=cin.nextBigInteger();
System.out.println(a.divide(b));
System.out.println(a.remainder(b));
}
}
}版权声明:本文为AC_Gibson原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。