【9111】高精度除法(高精度除高精度)

Time Limit: 1 second
Memory Limit: 2 MB

问题描述

输入两个高精度非0整数,输出它们的整数商(不考虑小数部分)。
    
 

Input

输入只有两行,第一行一个整数x,第二行一个整数y。其中0<=x<=10^200,0<=y<=10^200

Output

输出有1行,为两个数的整数商。

Sample Input

222222222233333333333333333333
222222222222222222222222222222

Sample Output

    1(换行)

【题解】
思路是,将除数一开始加上n个0,然后不断地用这个去减被除数。减了几次c[n]就为几。然后n--,即除数再除10,然后再用除数去减被除数。减了几次c[n-1]就为几。
其中涉及到高精度的比较,高精度减法等内容。
【代码】
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>

using namespace std;

int a[400],b[400],c[400];

void input_data(int a[]) //用一个输入过程。调用两次 就可以读入两个数字了。
{
	string s1;
	cin >> s1;
	a[0] = s1.size();
	for (int i = 1;i <= a[0];i++) //逆序存入a数组 a[0]用来存数字的长度
		a[i] = s1[a[0]-i] - '0';
}

bool can(int a[],int b[]) //判断a是否能被b减。如果能返回true
{
	if (a[0] > b[0]) return true;
	if (a[0] < b[0]) return false; //先由长度判断
	for (int i = a[0];i >= 1;i--)//再根据具体的每一位来判断.
		{
			if (a[i] > b[i]) return true;
			if (a[i] < b[i]) return false;
		}
	return true;		
}

void numcp(int a[],int b[],int w) //把a数组赋值给b数组,其中w表示a数字乘了10^w
{
	for (int i = 1;i <= a[0];i++)
		b[w+i-1] = a[i];
	b[0] = a[0] + w - 1;	
}

void jianfa(int a[],int b[]) //做高精度减法,用a减去b
{
	for (int i = 1;i <= a[0];i++)
		{
			if (a[i] < b[i])
				{
					a[i+1]--;
					a[i]+=10;	
				}
			a[i] = a[i] - b[i];
		}	

	while (a[0] > 1 && a[a[0]] == 0) a[0]--; //去掉前导0
}

void gaojingdu(int a[],int b[],int c[]) //高精度除法主程序
{
	int temp[200];
	int lenc = a[0]-b[0] + 1; //这是获取最多乘10的多少次方 同时也是答案数组的长度 可以手算模拟一下.
	for (int i = lenc;i >= 1;i--)	
		{
			memset(temp,0,sizeof(temp)); //temp数组归0
			numcp(b,temp,i);//把b*10^i 赋值给temp数组
			
			while (can(a,temp)) //不断地减,然后这个位上的答案递增.
				{
					jianfa(a,temp);
					c[i]++;
				}
		}
	while (lenc > 1 && c[lenc] == 0) //去掉前导0
		lenc--;
	c[0] = lenc; //把答案数字的长度赋值给c[0]
}

void output_ans()
{
	for (int i = c[0];i >= 1;i--) //打印答案
		printf("%d",c[i]);	
	if (c[0] <= 0) //像是1 / 22222222 这样,lenc = 一个负数。这个时候答案直接输出0就好了。
		printf("0");
}

int main()
{
	input_data(a);
	input_data(b);
	gaojingdu(a,b,c);
	output_ans();
	return 0;	
}



posted @ 2017-10-06 19:23  AWCXV  阅读(861)  评论(0编辑  收藏  举报