高精度除法与求余C++版和java版

高精度除法与求余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版权协议,转载请附上原文出处链接和本声明。