大数的运算

来源:互联网 发布:中国银行软件开发中心 编辑:程序博客网 时间:2024/05/22 14:55

一、大 数 的 加 法

 

Sample Input
2
1 2
112233445566778899     998877665544332211

Sample Output
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

 

首先将所有位对齐相加。如:

     1   2    3     4     5     6     7     8        9 
+   1   2    3     4     5     6     7     8        9  
———————————————————
     2   4    6     8   10    12   14   16      18
最后处理进位
 2   4     6     9    1      3     5     7        8

 

 

#include<stdio.h>
#include<string.h>
int main()
{
    int k,l,i,j;
    int  a1[1005],b1[1005],c[1006];
    char a[1005],b[1005];
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            scanf("%s",a);
            scanf("%s",b);
       memset(a1,0,1005*sizeof(int));  

       memset(b1,0,1005*sizeof(int));     

       memset( c, 0,1005*sizeof(int));

       for(k=0,i=strlen(a)-1; i>=0; i--)
                a1[k++]=a[i]-'0';
       for(k=0,i=strlen(b)-1; i>=0; i--)
                b1[k++]=b[i]-'0';
l=strlen(a)>strlen(b)?strlen(a):strlen(b);

       for(i=0; i<=l; i++)
            {
                if(a1[i]+b1[i]+c[i]>9)
                 {

                 c[i]=(c[i]+a1[i]+b1[i])%10;
                    c[i+1]++;

                 }
                else
                    c[i]=c[i]+a1[i]+b1[i];
            }
     if(c[l]==0)
            {

                for(i=l-1; i>=0; i--)
                    printf("%d",c[i]);
                    printf("\n");
            }
     else
            {

                for(i=l; i>=0; i--)
                    printf("%d",c[i]);
                    printf("\n");

            }

            }
            }
     return 0;
 }

 

 

二、大 数 的 乘法

 

Sample Input

1 2
112233445566778899     998877665544332211

Sample Output
Case 1:
1*2 = 2
Case 2:
112233445566778899 *998877665544332211 =112107482103740987777903741240815689

 

首先将所有位对应相乘。
情况1:
                             2        3                          
                *            2        3
                 ———————
                             6        9    
                 4          6
              ________________
                 4         12       9
              ________________
                 5          2        9 
 

首先将所有位对应相乘。情况2:

                            3        2                          
                *           3        2
                 ———————
                             6        4    
                 9          6
              ________________
                 9         12       4
              ________________
               10          2        4 

 

#include<stdio.h>
#include<string.h>
int main()
{
    int m,n,i,j,k,a[1000],b[1000],c[2000];
    char a1[1000],b1[1000];
    while(scanf("%s%s",a1,b1)!=EOF)
    {
        memset (a,0,sizeof(a));
        memset (b,0,sizeof(b));
        memset (c,0,sizeof(c));

        m=strlen(a1);
        n=strlen(b1);

        for(j=0,i=m-1; i>=0; i--,j++)
            a[j]=a1[i]-'0';
        for(j=0,i=n-1; i>=0; i--,j++)
            b[j]=b1[i]-'0';

      for(i=0; i<n; i++)
            for(j=0; j<m; j++)
                c[i+j]+=a[j]*b[i];
        for(i=0; i<n+m-2; i++)
            if(c[i]>=10)
            {
                c[i+1]+=c[i]/10;
                c[i]=c[i]%10;
            }
        if(c[m+n-2]==0)
            printf("0");
        else
        {
            for(i=m+n-2; i>=0 ; i--)
                printf("%d",c[i]);
        }
        printf("\n");
    }
    return 0;
}

 

三、数的阶乘

 

#include<stdio.h>
int main()
{
    int i,j,n,x,k,a[10000];
    while(scanf("%d",&n)!=EOF)
    {
        k=0;
        for(i=0; i<10000; i++)
            a[i]=1;
        for(i=1; i<=n; i++)
        {
            x=0;

       for(j=0; j<=k; j++)
            {

              a[j]=a[j]*i+x;
             x=a[j]/10000;a[j]=a[j]%10000;

            }
         if(x!=0)
        { k++;a[k]=x;}
            }
        printf("%d",a[k]);
        for(i=k-1; i>=0; i--)
              printf("%04d",a[i]);
         printf("\n");}
     return 0;
 }

 

四、大数的取余


Sample Input


1122334455667788998877665544332211       mod       99

Sample Output

1122334455667788998877665544332211       mod      99
= 0

 


      eg1、
  100      mod     99
  = (99+1)  mod     99
  = 99  mod   99  +  1 mod  99
  =   1

eg2、
 10000     mod   99
 =(9999+1)     mod   99
 =9999    mod   99 +1    mod   99
 =  1


      
          

      

 


        

 

原创粉丝点击