zoukankan      html  css  js  c++  java
  • 高精度除法

    今天尝试写了高精度除法(n进制),感觉不错,只有一处一开始没有注意到,后来才看书发现,见注释。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 100005
    using namespace std;
    int n,a[MAXN],b[MAXN],c[MAXN],tmp[MAXN];
    char dc[MAXN];
    void init(int a[])
    {
    	a[0]=strlen(dc);
    	for(int i=1;i<=a[0];i++)
    	{
    		if(dc[a[0]-i]>='0'&&dc[a[0]-i]<='9')
    			a[i]=int(dc[a[0]-i])-'0';
    		else a[i]=int(dc[a[0]-i])-'A'+10;
    	}
    }
    int com(int a[],int b[])
    {
    	if(a[0]<b[0])return -1;
    	if(a[0]>b[0])return 1;
    	for(int i=a[0];i>0;i--)
    	{
    		if(a[i]>b[i])return 1;
    		if(a[i]<b[i])return -1;
    	}
    	return 0;
    }
    void print(int a[])
    {
    	if(a[0]==0)
    	{
    		printf("0
    ");return;
    	}
    	for(int i=a[0];i>0;i--)
    		printf("%d",a[i]);
    	printf("
    ");
    }
    void add(int a[],int b[],int det)//在b第det位开始复制a
    {
    	b[0]=det+a[0]-1;
    	for(int i=det;i<=b[0];i++)
    		b[i]=a[i-det+1];
    } 
    void jian(int a[],int b[])//a-b
    {
    	if(com(a,b)==0)
    	{
    		a[0]=0;return;
    	}
    	for(int i=1;i<=a[0];i++)
    	{
    		if(a[i]<b[i])a[i]+=n,a[i+1]--;
    		a[i]-=b[i];
    	}
    }
    void chugao(int a[],int b[])//a/b
    {
    	if(com(a,b)<0)
    	{
    		c[0]=1;c[1]=0;return;
    	}
    	if(com(a,b)==0)
    	{
    		c[0]=1;c[1]=1;a[0]=0;return;	
    	}
    	c[0]=a[0]-b[0]+1;
    	for(int i=a[0]-b[0]+1;i>0;i--)
    	{
    		memset(tmp,0,sizeof tmp);//!!!否则com时会出错 
    		add(b,tmp,i);
    		while(com(a,tmp)>=0)
    		{
    			jian(a,tmp);
    			c[i]++;
    //			for(int i=a[0];i>0;i--)
    //			{
    //				if(a[i]==0)a[0]--;
    //				else break;
    //			}
    			while(a[0]>0&&a[a[0]]==0)a[0]--;
    		}
    	}
    	while(c[0]>0&&c[c[0]]==0)c[0]--;
    //	c[0]=1;
    //	while(c[c[0]]==0)c[0]++;
    }
    int main()
    {
    	cin>>n;
    	cin>>dc;
    	init(a);
    	cin>>dc;
    	init(b);
    	chugao(a,b);
    //	for(int i=a[0]-b[0]+1;i>=c[0];i--)
    //		printf("%d",c[i]);
    //	printf("
    ");
    //	for(int i=a[0];i>0;i--)
    //		printf("%d",a[i]);
    	print(c);
    	print(a);
    	return 0;
    }
    

      

  • 相关阅读:
    Educational Codeforces Round 11 复盘
    Tarjan 杂题选讲
    2021-10-31 两校联考 题解
    COCI19-20#6 Trener & COI2020 题解
    CSP 2021 游记
    Educational Codeforces Round 9 题解
    Educational Codeforces Round 8 部分题解
    Educational Codeforces Round 7 部分题解
    CSP2021自闭记
    二项式系数相关恒等式的记录与复习
  • 原文地址:https://www.cnblogs.com/Zinn/p/8526032.html
Copyright © 2011-2022 走看看