zoukankan      html  css  js  c++  java
  • 2737:大整数除法

    转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8443699.html

    思路:将除法转为连减,每次减去除数的一倍,指定会超时,比如9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 / 1。解决办法是将被除数扩大,扩大的时候直接在后边加0即可。然后用大数加法累加扩大倍数。

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 int mult(int *a, int *b)
      5 {
      6     int i, j;
      7     int flag=0;
      8     for(i=max(a[0], b[0]); i>0; i--)
      9     {
     10         if(a[i]>b[i])
     11         {
     12             flag=1;
     13             break;
     14         }
     15         if(a[i]<b[i])
     16         {
     17             flag=-1;
     18             break;
     19         }
     20     }
     21     if(flag==-1)   return -1;//处理小于等于情况
     22     if(flag==0)    return 0;
     23 
     24     int k=b[0];//将 b 的长度保留下来
     25 
     26     //reverse(&b[1],&b[1]+b[0]);//扩大倍数
     27     if(a[a[0]]>b[b[0]])
     28     {
     29          reverse(&b[1],&b[1]+b[0]);//扩大倍数
     30         b[0]+=(a[0]-b[0]);//比如3200和20
     31     }
     32     else
     33     {
     34         reverse(&b[1],&b[1]+b[0]);//扩大倍数
     35         b[0]+=(a[0]-b[0]-1) ;
     36     }
     37     reverse(&b[1],&b[1]+b[0]);
     38 
     39     for(i=1; i<=a[0]; i++)//做个减法
     40     {
     41         if(a[i]<b[i])
     42         {
     43             a[i+1]--;
     44             a[i]+=10;
     45         }
     46         a[i]-=b[i];
     47     }
     48     while(a[a[0]]==0)
     49         a[0]--;
     50 
     51 
     52 
     53     int m=b[0]-k+1;//扩大倍数
     54     reverse(&b[1],&b[1]+b[0]);
     55     b[0]=k;
     56     reverse(&b[1],&b[1]+b[0]);
     57     return m;
     58 }
     59 
     60 int main()
     61 {
     62     string s1,s2;
     63     cin>>s1>>s2;
     64     int a[200]= {0},b[200]= {0};
     65     a[0]=s1.length();
     66     b[0]=s2.length();
     67     int i,j,t;
     68 
     69     for(i=1; i<=a[0]; i++)
     70     {
     71         a[i]=s1[a[0]-i]-'0';
     72     }
     73     while(a[a[0]]==0)
     74         a[0]--;
     75     for(i=1; i<=b[0]; i++)
     76     {
     77         b[i]=s2[b[0]-i]-'0';
     78     }
     79     while(b[b[0]]==0)
     80         b[0]--;/*读入数据并清除前导0,比如000003*/
     81 
     82     if(b[0]<1)//b为0的情况
     83     {
     84         return 0;
     85     }
     86 
     87     int c[200]= {0}; c[0]=1;//c数组用来保存结果
     88     int d[250]= {0}; d[0]=1;//d数组用来保存临时返回结果
     89 
     90     while(1)
     91     {
     92         t=mult(a,b);//做减法
     93         if(t==-1)   break;//被除数小于除数
     94         if(t==0)    d[1]=1;//被除数等于除数
     95         else        d[t]=1;
     96         int k=max(c[0], t);
     97         for(j=1; j<=k; j++)
     98         {
     99             c[j+1]+=(c[j]+d[j])/10;
    100             c[j]=(c[j]+d[j])%10;
    101         }
    102         if(c[k+1]>0)    c[0]=k+1;
    103         else    c[0]=k;
    104 
    105         d[t]=0;//将d恢复
    106         if(t==0)   break;
    107     }
    108     for(i=c[0]; i>0; i--)
    109     {
    110         cout<<c[i];
    111     }
    112 /*
    113     cout<<endl;
    114      cout<<"a余:";
    115      if(t==0) cout<<0;
    116      else
    117     for(i=a[0]; i>0; i--)
    118     {
    119         cout<<a[i];
    120     }
    121     cout<<endl<<endl;
    122 *//*注释部分为打印余数*/
    123 }
  • 相关阅读:
    sql 作业创建
    sqlserver的触发器练习实例
    js按钮频繁提交解决方案:
    C# 使用WebClient下载文件到本地目录
    放松读物,再看css禅意花园-总结HTML-又收到两个标记
    放松读物,再看css禅意花园-总结HTML
    放松读物,再看css禅意花园-HTML是CSS设计的基础
    线段的垂直平分线12
    放松读物,再看css禅意花园-第一章学到的教训-文本的可缩放
    放松读物,再看css禅意花园-第一章继续学到的教训
  • 原文地址:https://www.cnblogs.com/zhishoumuguinian/p/8443699.html
Copyright © 2011-2022 走看看