大整数 问题

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

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");



    }
}


 
原文地址:https://www.cnblogs.com/acSzz/p/2609017.html