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

    1.大数的加法

          语法:add(char a[],char b[],char s[]);

          参数:

          a[]:被加数,用字符串表示,位数不限

          b[]:加数,用字符串表示,位数不限

          s[]:结果,用字符串表示

          返回值:null

          注意: 

          空间复杂度为 o(n^2)

          需要 string.h

          源程序:  

     void add(char a[],char b[],char back[])
     
          {
     
              int i,j,k,up,x,y,z,l;
     
              char *c;
     
              if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
     
              c=(char *) malloc(l*sizeof(char));
     
              i=strlen(a)-1;
     
              j=strlen(b)-1;
     
              k=0;up=0;
     
              while(i>=0||j>=0)
     
                  {
     
                      if(i<0) x='0'; else x=a[i];
     
                      if(j<0) y='0'; else y=b[j];
     
                      z=x-'0'+y-'0';
     
                      if(up) z+=1;
     
                      if(z>9) {up=1;z%=10;} else up=0;
     
                      c[k++]=z+'0';
     
                      i--;j--;
     
                  }
     
              if(up) c[k++]='1';
     
              i=0;
     
              c[k]='';
     
              for(k-=1;k>=0;k--)
     
                  back[i++]=c[k];
     
              back[i]='';
     
          } 
    

    2.大数的减法 (未处理负数情况)


         语法:sub(char s1[],char s2[],char t[]);

         参数:

          s1[]:被减数,用字符串表示,位数不限

          s2[]:减数,用字符串表示,位数不限

          t[]:结果,用字符串表示

          返回值:null

          注意: 

          默认s1>=s2,程序未处理负数情况

         需要 string.h

         源程序: 

     void sub(char s1[],char s2[],char t[])
          {
              int i,l2,l1,k;
              l2=strlen(s2);l1=strlen(s1);
              t[l1]='';l1--;
              for (i=l2-1;i>=0;i--,l1--)
                  {
                  if (s1[l1]-s2[i]>=0) 
                      t[l1]=s1[l1]-s2[i]+'0';
                  else
                      {
                      t[l1]=10+s1[l1]-s2[i]+'0';
                      s1[l1-1]=s1[l1-1]-1;
                      }
                  }
              k=l1;
              while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}
              while(l1>=0) {t[l1]=s1[l1];l1--;}
          loop:
              if (t[0]=='0') 
                  {
                  l1=strlen(s1);
                  for (i=0;i<l1-1;i++) t[i]=t[i+1];
                  t[l1-1]='';
                  goto loop;
                  }
              if (strlen(t)==0) {t[0]='0';t[1]='';}
          } 
    

    3.大数的乘法  ---大数乘小数


          语法:mult(char c[],char t[],int m);

          参数:

          c[]:被乘数,用字符串表示,位数不限

           t[]:结果,用字符串表示 

          m:乘数,限定10以内

          返回值:null

          注意: 

          需要 string.h

          源程序:  

    void mult(char c[],char t[],int m)
          {
              int i,l,k,flag,add=0;
              char s[100];
              l=strlen(c);
              for (i=0;i<l;i++)
                  s[l-i-1]=c[i]-'0'; 
              for (i=0;i<l;i++)
                     {
                     k=s[i]*m+add;
                     if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else 
          {s[i]=k;flag=0;add=0;}
                     }
              if (flag) {l=i+1;s[i]=add;} else l=i;
              for (i=0;i<l;i++)
                  t[l-1-i]=s[i]+'0';
              t[l]='';
          }
    

    4.大数的乘法  ---大数乘大数


      语法:mult(char a[],char b[],char s[]);

         参数:

          a[]:被乘数,用字符串表示,位数不限

          b[]:乘数,用字符串表示,位数不限

          t[]:结果,用字符串表示

          返回值:null

          注意: 

           空间复杂度为 o(n^2)

           需要 string.h

          源程序:  

    void mult(char a[],char b[],char s[])
          {
              int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
              char result[65];
              alen=strlen(a);blen=strlen(b); 
              for (i=0;i<alen;i++)
              for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');
              for (i=alen-1;i>=0;i--)
                  {
                      for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];
                      result[k]=sum%10;
                      k=k+1;
                      sum=sum/10;
                  }
              for (i=blen-2;i>=0;i--)
                  {
                      for (j=0;j<=i;j++) sum=sum+res[i-j][j];
                      result[k]=sum%10;
                      k=k+1;
                      sum=sum/10;
                  }
              if (sum!=0) {result[k]=sum;k=k+1;}
              for (i=0;i<k;i++) result[i]+='0';
              for (i=k-1;i>=0;i--) s[i]=result[k-1-i];
              s[k]='';
              while(1)
                  {
                  if (strlen(s)!=strlen(a)&&s[0]=='0') 
                      strcpy(s,s+1);
                  else
                      break;
                  }
          }
    

    5.大数的阶乘


          语法:int result=factorial(int n);

          参数:

          n:n 的阶乘

          返回值:阶乘结果的位数

          注意: 

           本程序直接输出n!的结果,需要返回结果请保留long a[]

          需要 math.h

          源程序:  

    int factorial(int n)
          {
          long a[10000];
          int i,j,l,c,m=0,w; 
          a[0]=1; 
          for(i=1;i<=n;i++)
              { 
              c=0; 
              for(j=0;j<=m;j++)
                  { 
                  a[j]=a[j]*i+c; 
                  c=a[j]/10000; 
                  a[j]=a[j]%10000; 
              } 
              if(c>0) {m++;a[m]=c;} 
          } 
     
          w=m*4+log10(a[m])+1;
          printf("
    %ld",a[m]); 
          for(i=m-1;i>=0;i--) printf("%4.4ld",a[i]);
          return w;
          } 
    

    6.大数的比较


           语法:int compare(char a[],char b[]);

          参数: 

          a[]:被比较数,用字符串表示,位数不限

          b[]:比较数,用字符串表示,位数不限

          返回值: 0    a<b

                      1    a>b

                      2    a=b

          源程序: 

    int compare(char a[], char b[])  
    {  
        int lena=strlen(a);  
        int lenb=strlen(b);  
        if(lena>lenb)  
            return 1;  
        else if(lena<lenb)  
            return 0;  
        for(int i=0;i<lena;i++)  
        {  
            if(a[i]>b[i])  
                return 1;  
            else if(a[i]<b[i])  
                return 0;  
        }  
        return 2;  
    }  
    
  • 相关阅读:
    Java文件读取
    Java继承
    JAVA程序提示错误:需要class,interface或enum解决方法
    SQL 修改列名
    转 父表字表统计查询的sql练习
    powerdesigner12.5入门教程
    现实世界
    oracle添加联合主键
    hashtable的用法
    JQ 1
  • 原文地址:https://www.cnblogs.com/lightmare/p/10398765.html
Copyright © 2011-2022 走看看