• 大整数除法


    //大整数除法
    #include<stdio.h>
    #include<string.h>
    
    #define MAX_LEN 200
    
    char szLine1[MAX_LEN+10];
    char szLine2[MAX_LEN+10];
    
    int an1[MAX_LEN+10];
    int an2[MAX_LEN+10];
    
    int aResult[MAX_LEN+10];
    int Substract(int *p1,int *p2,int nLen1,int nLen2)//返回值代表结果的长度 
    {
    	int i;
    	if(nLen1<nLen2) return -1;
    	bool bLarger=false;
    	if(nLen1==nLen2)
    	{
    		for(i=nLen1-1;i>=0;i--)
    		{
    			if(p1[i]>p2[i])
    				bLarger=true;
    			else if(p1[i]<p2[i]){
    				if(!bLarger)
    					return -1;
    			}
    		}
    	}
    	for(i=0;i<nLen1;i++)
    	{
    		p1[i]-=p2[i];
    		if(p1[i]<0)
    		{
    			p1[i]+=10;
    			p1[i+1]--;
    		}
    	}
    	for(i=nLen1-1;i>=0;i--)
    		if(p1[i])
    			return i+1;
    	return 0;
    }
    int main()
    {
    	int t,n;
    	scanf("%d",&n);
    	for(t=0;t<n;t++)
    	{
    		scanf("%s",szLine1);
    		scanf("%s",szLine2);
    		int i,j;
    		memset(an1,0,sizeof(an1));
    		memset(an2,0,sizeof(an2));
    		memset(aResult,0,sizeof(aResult));
    		int nLen1=strlen(szLine1);
    		j=0;
    		for(i=nLen1-1;i>=0;i--)
    			an1[j++]=szLine1[i]-'0';
    		int nLen2=strlen(szLine2);
    		j=0;
    		for(i=nLen2-1;i>=0;i--)
    			an2[j++]=szLine2[i]-'0';
    		if(nLen1<nLen2)
    		{
    			printf("0
    ");
    			continue;
    		}
    		nLen1=Substract(an1,an2,nLen1,nLen2);
    		if(nLen1<0)
    		{
    			printf("0
    ");
    			continue;
    		}
    		else if(nLen1==0)
    			{
    				printf("1
    ");
    				continue;
    			}
    		aResult[0]++;
    		int nTimes=nLen1-nLen2;
    		if(nTimes<0)
    			goto OutputResult;
    		else if(nTimes>0)
    		{
    			for(i=nLen1-1;i>=0;i--)
    			{
    				if(i>=nTimes)
    					an2[i]=an2[i-nTimes];
    				else
    					an2[i]=0;
    			}
    		}
    		nLen2=nLen1;
    		for(j=0;j<=nTimes;j++)
    		{
    			int nTmp;
    			while((nTmp=Substract(an1,an2+j,nLen1,nLen2-j))>=0)
    			{
    				nLen1=nTmp;
    				aResult[nTimes-j]++;
    			}
    		}
    		OutputResult:
    			for(i=0;i<MAX_LEN;i++)
    			{
    				if(aResult[i]>=10)
    				{
    					aResult[i+1]+=aResult[i]/10;
    					aResult[i]%10;
    				}
    			}
    			bool bStartOutput=false;
    			for(i=MAX_LEN;i>=0;i--)
    				if(bStartOutput)
    					printf("%d",aResult[i]);
    				else if(aResult[i])
    					{
    						printf("%d",aResult[i]);
    						bStartOutput=true;
    					}
    			if(!bStartOutput) printf("0
    ");
    			printf("
    ");
    	}
    	return 0;
    }

  • 相关阅读:
    C#编程(八)--------- Main函数
    C#编程(七)----------命名空间
    C#编程(五)----流程控制
    C#编程(六)------------枚举
    C#编程(四)
    新一代蓝牙5标准开启 会成为物联网的最佳选择吗
    向阳网络:跬步千里_且看初创企业的上云之路
    单片机如何过渡到嵌入式?
    spark源码系列文章------shuffle模块详解
    Linux系统小技巧(4):环境变量JAVA_TOOL_OPTIONS简介
  • 原文地址:https://www.cnblogs.com/javafly/p/6037187.html
Copyright © 2020-2023  润新知