• 大整数 问题


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

    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");
    
    
    
        }
    }
    
    
    
     
  • 相关阅读:
    NOIP2017 D1T2 时间复杂度
    NOIP2017 游记
    NOIP2017 Day-1 模板荟萃
    NOIP2013 货车运输 倍增
    洛谷3933 Chtholly Nota Seniorious 二分答案+贪心
    洛谷2474 [SCOI2008] 天平 差分约束->枚举
    bzoj1270 BeijingWc2008 雷涛的小猫 DP
    poj1061--青蛙的约会--扩展欧几里得
    “整除”的相关
    poj1067--取石子游戏--(神奇的黄金分割比)
  • 原文地址:https://www.cnblogs.com/acSzz/p/2609017.html
Copyright © 2020-2023  润新知