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;
    }
    

      

  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/Zinn/p/8526032.html
Copyright © 2011-2022 走看看