百鍊 2737:大整數除法

2737:大整數除法

時間限制:
1000ms
內存限制:
65536kB
描述
求2個大的正整數相除的商
輸入
第1行是測試數據的組數n,每組測試數據佔2行,第1行是被除數,第2行是除數。每組測試數據之間有一個空行,每行數據不超過100個字符
輸出
n行,每組測試數據有一行輸出是相應的整數商
樣例輸入
3
2405337312963373359009260457742057439230496493930355595797660791082739646
2987192585318701752584429931160870372907079248971095012509790550883793197894

10000000000000000000000000000000000000000
10000000000

5409656775097850895687056798068970934546546575676768678435435345
1
樣例輸出
0
1000000000000000000000000000000
5409656775097850895687056798068970934546546575676768678435435345
提示
思路用數組存比如12345/3
12345/30000 12345/3000  9345/3000 6345/3000  3345/3000 ......
代碼實現
#include<stdio.h>
#include<string.h>
int main()
{
	int a[1000],b[1000],c[1000],i,j,k1,k2,n,m,count,flag,flag1,k;
	char  st1[1000],st2[1000];
	scanf("%d",&n);
	while(n--)
	{
	    scanf("%s%s",st1,st2);
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		k1=strlen(st1);
		k=k1;
		k2=strlen(st2);
		if(k1<k2) {printf("0\n");continue;}
		for(i=0;i<=k1-1;i++)
			a[i]=st1[k1-i-1]-'0';
		m=k1-k2;
		for(i=0;i<=k2-1;i++)
			b[i+m]=st2[k2-i-1]-'0';
		count=0;
		while(count<=m)
		{
			flag=1;
			if(k1<k2+m-count) flag=0;
			if(k1==k2+m-count) 
			{
				flag1=0;
				for(j=k1-1;j>=0&&flag1==0;j--)
				{
					if(a[j]>b[j+count]) flag1=1;
					else
						if(a[j]<b[j+count])
							flag=0;
				}
			}
			if(flag==1)
			{
			for(i=0;i<=k1-1;i++)
			{
				a[i]=a[i]-b[i+count];
				if(a[i]<0)
				{
					a[i+1]--;
					a[i]+=10;
				}
			}
			while(a[k1-1]==0&&k1>=1) k1--;
			}
			if(flag==1) c[m-count]++;
			if(flag==0) count++;
		}
         i=k;
		 while(c[i]==0&&i>0)
		 {
			 i--;
		 }
		 for(k=i;k>=0;k--)
			 printf("%d",c[k]);
		 printf("\n");

	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章