zoukankan      html  css  js  c++  java
  • 大整数 问题

    高精度除法:(利用了 减法)

    http://poj.grids.cn/practice/2737/ 原理 : 例如 a
    =13455 除以 b=3 先把 3 增大为 30000 不够减 右移一位 变为 3000 这样不断的减 直到 不够减 为 1456 则 可知 商的 千位 为 4(因为 30003 的 1000倍) 这样 3000 在右移一位 300 依此类推 得到 百位、十位,个位; #include<stdio.h> #include<string.h> const int maxn=300; int a[maxn],b[maxn],c[maxn]; char str1[maxn],str2[maxn],re[maxn]; int len1,len2; int sub(int a[],int b[],int len) { int i; if(len1<len)return 0; if(len==len1) { for(i=len1-1;i>=0;i--) { if(a[i]>b[i])break; else if(a[i]<b[i]) return 0; } } for(i=0;i<len1;i++) { a[i]=a[i]-b[i]; if(a[i]<0) { a[i+1]--; a[i]+=10; } } while(a[len1-1]==0&&len1>=1)len1--; return 1; } int main() { int t,i,j; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(re,0,sizeof(re)); scanf("%s%s",str1,str2); len1=strlen(str1); len2=strlen(str2); if(len1<len2){printf("0\n");continue;} int l=len1; int dis=len1-len2; for(i=0;i<len1;i++) a[i]=str1[len1-1-i]-'0'; for(i=0;i<len2;i++) b[i+dis]=str2[len2-1-i]-'0'; i=0; while(i<=dis) { if(sub(a,b+i,len2+dis-i)) { re[dis-i]++; } else i++; } for(i=l;i>=0;i--) { if(re[i]!=0)break; } if(i<0)puts("0"); else { for(;i>=0;i--)printf("%d",re[i]); printf("\n"); } } }






    /*
    http://poj.org/problem?id=1001
    求实数的 n次方
    题解:
     去掉小数点 ,作为 整数相乘
     注意的地方那个就是,去掉小数点后,如 0.01 去掉后 变为 了001 乘积 为 1 所以我么要注意
     小数点所在的位置 ,和 积的位数进行比较 要么添加 0,要呢不添加
     
     还有就是
     10.000  的平方输出应为 100 没有小数点
    */





    View Code
    #include<stdio.h>
    #define maxn 3000
    #include<string.h>
    #include<iostream>
    using namespace std;
    int len1,len2;
    int a[maxn],b[maxn],c[maxn];
    char str[maxn];
    void mul(int a[],int b[])
    {
        int i,j;
        memset(c,0,sizeof(c));
        for(i=0;i<len1;i++)
        {
            for(j=0;j<len2;j++)
            {
                c[i+j]+=a[i]*b[j];
            }
        }
        for(i=0;i<len1+len2;i++)
        {
            if(c[i]>=10)
            {
                c[i+1]+=c[i]/10;
                c[i]=c[i]%10;
            }
        }
        for(i=len1+len2;i>=0;i--)
        {
            if(c[i]!=0)break;
        }
        if(i==-1)len2=0;
        else len2=i+1;
        for(i=0;i<len2;i++)
        {
    
            b[i]=c[i];
        }
    
    }
    int main()
    {
        int i,d;
        while(cin>>str>>d)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
    
             int len=strlen(str);
             int f=0,k=0;
            for(i=len-1;i>=0;i--)
            {
                if(str[i]=='.'){f=1;k=i;}
    
            }
    
            if(d==0){printf("1\n");continue;}
    
             len1=0;
            for(i=0;i<len;i++)
            {
                if(str[len-1-i]!='.')
                  a[len1++]=str[len-1-i]-'0';
            }
    
            b[0]=1;
            len2=1;
            int l=d;
            while(l--)
            {
    
                mul(a,b);
            }
            if(f==0)
            {
                for(i=len2-1;i>=0;i--)
               {
                printf("%d",b[i]);
    
               }
    
            }
            else
            {
                char str2[maxn];
                int num=(len-1-k)*d;
                 int l,r;
                  if(len2<=num)
                  {
    
                     str2[num]='.';
                    for(i=num-1;i>=len2;i--)str2[i]='0';
                    for(i=len2-1;i>=0;i--)str2[i]='0'+b[i];
                    len2=num+1;
                    l=0;
                    for(i=0;i<len2;i++)
                    {
                        if(str2[i]!='0')
                        {
                            l=i;
    
                            break;
                        }
                    }
                    r=len2-1;
                    for(i=len2-1;i>=0;i--)
                    {
                        if(str2[i]!='0'){r=i;break;}
                    }
    
                    for(i=r;i>=l;i--)printf("%c",str2[i]);
    
                  }
                  else
                  {
                      int h=0;
                      for(h=len2,i=len2-1;i>=0;i--)
                      {
                          if(i== num -1)str2[h--]='.';
                           str2[h--]='0'+b[i];
    
                      }
    
    
                      l=0;
    
                    for(i=0;i<=len2;i++)
                    {
                        if(str2[i]!='0'){l=i;break;}
                    }
                    if(l==num)l++;
                     r=len2;
    
                     for(i=len2;i>=0;i--)
                    {
                        if(str2[i]!='0'){r=i;break;}
                    }
    
                    for(i=r;i>=l;i--)printf("%c",str2[i]);
    
                  }
            }
            printf("\n");
    
    
    
        }
    }
    
    
    
     
  • 相关阅读:
    Python 集合
    Python sorted()
    CodeForces 508C Anya and Ghosts
    CodeForces 496B Secret Combination
    CodeForces 483B Friends and Presents
    CodeForces 490C Hacking Cypher
    CodeForces 483C Diverse Permutation
    CodeForces 478C Table Decorations
    CodeForces 454C Little Pony and Expected Maximum
    CodeForces 313C Ilya and Matrix
  • 原文地址:https://www.cnblogs.com/acSzz/p/2609017.html
Copyright © 2011-2022 走看看