zoukankan      html  css  js  c++  java
  • [codevs3118]高精度除法<高精度>

    题目链接:http://codevs.cn/problem/3118/

    为了做一道名为国王游戏的贪心,我跑来学习了高精度除法。。。。相传,高精度除法是高精度四个基本运算最难的

    但事实上,高精度除法可以看成其他高精度的组合。。。

    我们班一位大佬告诉我,对于高精度除法这类的题,他一直都是二分出这个商,然后高精度乘法来check一下。。。。

    当然这是方法之一。。。我在这道题用的方法是高精度减法来做高精度除法

    【步骤】

    1.找到除数与被除数相差的位数并记录下。。。设相差了x位,则除数与被除数的商最大为x+1位数。。。这个结论举个例子就知道了

    2.然后我们从x+1位开始做。。让除数扩大10^x倍,变成和被除数相同的位数,然后比较大小,如果能减去就减去,设减去了i次,则商的x+1位为i

    在这个地方我们用例子来说明:

    3886218:被除数
    56322:除数

    3886218<56322*100不执行减法操作。。。3886218>56322*100,执行减法,可以减去6个56322*10变成506898

    506898>56322,并且可以减去9个56322,变成0 ,所以商就是6*10+9,余数为0

    说白了,高精度除法就是执行减法,看从被除数中最多可以减去多少个除数,所以高精度除法就是多次高精度减法

    高精度除法模板:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<queue>
     6 #include<cstdlib>
     7 #include<cmath>
     8 #define maxn 1005
     9 using namespace std;
    10 
    11 int a1[maxn],a2[maxn],a3[maxn],a4[maxn];
    12 int len1,len2;
    13 char s1[maxn],s2[maxn];
    14 
    15 int check(int a[],int b[]){
    16     if(a[0]<b[0])return 0;
    17     if(a[0]>b[0])return 1;
    18     for(int i=a[0];i>=1;i--){
    19         if(a[i]>b[i])return 1;
    20         if(a[i]<b[i])return 0;
    21     }
    22     return 1;        
    23 }
    24 
    25 void _minus(int a[],int b[]){
    26     for(int i=1;i<=a[0];i++){
    27         if(a[i]<b[i]){
    28             a[i]+=10;a[i+1]--;
    29         }
    30         a[i]-=b[i];
    31     }
    32     while(a[a[0]]==0&&a[0]>1)//余数的位数
    33         a[0]--;
    34 }
    35 
    36 int main(){
    37     scanf("%s%s",s1+1,s2+1);
    38     len1=strlen(s1+1);
    39     len2=strlen(s2+1);
    40     for(int i=1;i<=len1;i++)a1[i]=s1[len1-i+1]-'0';
    41     for(int i=1;i<=len2;i++)a2[i]=s2[len2-i+1]-'0';
    42     a1[0]=len1;a2[0]=len2;
    43     a4[0]=len1-len2+1;
    44     for(int i=a4[0];i>0;i--){
    45         memset(a3,0,sizeof(a3));
    46         for(int j=1;j<=a2[0];j++){
    47             a3[j+i-1]=a2[j];//移i位 
    48         }
    49         a3[0]=a2[0]+i-1;
    50         while(check(a1,a3)){
    51             a4[i]++;_minus(a1,a3);
    52         }
    53     }
    54     while(a4[a4[0]]==0&&a4[0]>1)//商的位数
    55         a4[0]--;
    56     for(int i=a4[0];i>=1;i--){
    57         printf("%d",a4[i]);
    58     } 
    59 /*
    60 3886218
    61 56322
    62 out:69
    63 */
    64 }
    View Code
  • 相关阅读:
    11月21日
    11月20日
    11月19日
    11月18日
    11月17日
    11月15日
    图文教程:在Mac上搭建Titanium的iOS开发环境
    经验
    IT术语的正确读法
    NSLog( @"%@", i );
  • 原文地址:https://www.cnblogs.com/Danzel-Aria233/p/7685064.html
Copyright © 2011-2022 走看看