zoukankan      html  css  js  c++  java
  • 【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;	
    }



  • 相关阅读:
    【STL】queue容器
    【STL】stack容器
    【STL】deque容器
    【STL】迭代器
    【STL】vector容器
    【STL】string
    tensorflow学习012——tf.keras函数式API
    tensorflow学习010——优化函数、学习速率、反向传播算法、网络优化、超参数
    Tensorflow学习009——softmax多分类
    tensorflow学习008——逻辑回归实现
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632407.html
Copyright © 2011-2022 走看看