大数相加与相乘算法实现

众所周知,在一个很大的数字相加和相乘时,传统的整数类型规定的大小范围已经满足不了我们的需要,所以我们需要算法来实现大数相加与相乘。

大数相加 思维参考

思路很简单,通过整数型数组存入每一个数字,然后模拟小学时学得的加法运算,如果个位数相加超过10,则十位数加一,然后个位数减十,不断的进位来实现整个过程。

大数相加 sample

123456789 + 987654321 = ?

过程样例

大数相加 代码实现

#include<stdio.h>//不理解的可以加断点走一边过程
#include<string.h>
#define N 200
int main()
{
    char a[N];
    char b[N];
    int na[N];
    int nb[N];
    while(~scanf("%s%s",a,b))
    {
        memset(na,0,sizeof(na));
        memset(nb,0,sizeof(nb));
        int la=strlen(a);
        int lb=strlen(b);
        int cnt=0;
        for(int i=la-1;i>=0;i--)
            na[cnt++]=a[i]-'0';
        int snt=0;
        for(int i=lb-1;i>=0;i--)
            nb[snt++]=b[i]-'0';
        for(int i=0;i<=N;i++)
        {
            na[i]+=nb[i];
            if(na[i]>=10)
            {
                na[i]-=10;
                na[i+1]+=1;
            }
        }
        printf("两数相加结果为:\n");
        if(la>=lb)
        {
            for(int i=la;i>=0;i--)
            {
                if(na[i]==0&&i==la)continue;
                printf("%d",na[i]);
            }
        }
        else
        {
            for(int i=lb;i>=0;i--)
            {
                if(na[i]==0&&i==lb)continue;
                printf("%d",na[i]);
            }
        }
        printf("\n");
    }
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

大数相乘 思维参考

接下来我们再来聊一聊关于大数相乘算法,其实相乘算法思路基本上和相加没有区别,也是通过代码模拟我们曾经学得的乘法的

大数相乘 sample

835 * 49 = ?
过程样例
过程样例

大数相乘 代码实现

#include <stdio.h>
#include<string.h>
#define N 1001
int main()
{
    char a[N];
    char b[N];
    int na[N];
    int nb[N];
    int nc[N];
    while(~scanf("%s%s",a,b))
    {
        if(a[0]=='0'||b[0]=='0')
        {
            printf("0\n");
            continue;
        }
        memset(na,0,sizeof(na));
        memset(nb,0,sizeof(nb));
        memset(nc,0,sizeof(nc));
        int la=strlen(a);
        int lb=strlen(b);
        int cnt=0;
        for(int i=la-1;i>=0;i--)
            na[cnt++]=a[i]-'0';
        int snt=0;
        for(int i=lb-1;i>=0;i--)
            nb[snt++]=b[i]-'0';
        for(int i=0;i<cnt;i++)
        {
            for(int j=0;j<snt;j++)
            {
                nc[i+j]+=na[i]*nb[j];
            }
        }
        for(int i=0;i<(cnt+snt);i++)
        {
            if(nc[i]>=10)
            {
                int tmp=nc[i]/10;
                nc[i]=nc[i]%10;
                nc[i+1]+=tmp;
            }
        }
        printf("两数相乘结果为:\n");
        for(int i=N-1;nc[i]==0;i--)
        {
            if(nc[i-1]!=0)
            {
                for(int j=i-1;j>=0;j--)
                    printf("%d",nc[j]);
                break;
            }
        }
        printf("\n");
    }
}
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

众所周知,在一个很大的数字相加和相乘时,传统的整数类型规定的大小范围已经满足不了我们的需要,所以我们需要算法来实现大数相加与相乘。

大数相加 思维参考

思路很简单,通过整数型数组存入每一个数字,然后模拟小学时学得的加法运算,如果个位数相加超过10,则十位数加一,然后个位数减十,不断的进位来实现整个过程。

大数相加 sample

123456789 + 987654321 = ?

过程样例

大数相加 代码实现

#include<stdio.h>//不理解的可以加断点走一边过程
#include<string.h>
#define N 200
int main()
{
    char a[N];
    char b[N];
    int na[N];
    int nb[N];
    while(~scanf("%s%s",a,b))
    {
        memset(na,0,sizeof(na));
        memset(nb,0,sizeof(nb));
        int la=strlen(a);
        int lb=strlen(b);
        int cnt=0;
        for(int i=la-1;i>=0;i--)
            na[cnt++]=a[i]-'0';
        int snt=0;
        for(int i=lb-1;i>=0;i--)
            nb[snt++]=b[i]-'0';
        for(int i=0;i<=N;i++)
        {
            na[i]+=nb[i];
            if(na[i]>=10)
            {
                na[i]-=10;
                na[i+1]+=1;
            }
        }
        printf("两数相加结果为:\n");
        if(la>=lb)
        {
            for(int i=la;i>=0;i--)
            {
                if(na[i]==0&&i==la)continue;
                printf("%d",na[i]);
            }
        }
        else
        {
            for(int i=lb;i>=0;i--)
            {
                if(na[i]==0&&i==lb)continue;
                printf("%d",na[i]);
            }
        }
        printf("\n");
    }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

大数相乘 思维参考

接下来我们再来聊一聊关于大数相乘算法,其实相乘算法思路基本上和相加没有区别,也是通过代码模拟我们曾经学得的乘法的

大数相乘 sample

835 * 49 = ?
过程样例
过程样例

大数相乘 代码实现

#include <stdio.h>
#include<string.h>
#define N 1001
int main()
{
    char a[N];
    char b[N];
    int na[N];
    int nb[N];
    int nc[N];
    while(~scanf("%s%s",a,b))
    {
        if(a[0]=='0'||b[0]=='0')
        {
            printf("0\n");
            continue;
        }
        memset(na,0,sizeof(na));
        memset(nb,0,sizeof(nb));
        memset(nc,0,sizeof(nc));
        int la=strlen(a);
        int lb=strlen(b);
        int cnt=0;
        for(int i=la-1;i>=0;i--)
            na[cnt++]=a[i]-'0';
        int snt=0;
        for(int i=lb-1;i>=0;i--)
            nb[snt++]=b[i]-'0';
        for(int i=0;i<cnt;i++)
        {
            for(int j=0;j<snt;j++)
            {
                nc[i+j]+=na[i]*nb[j];
            }
        }
        for(int i=0;i<(cnt+snt);i++)
        {
            if(nc[i]>=10)
            {
                int tmp=nc[i]/10;
                nc[i]=nc[i]%10;
                nc[i+1]+=tmp;
            }
        }
        printf("两数相乘结果为:\n");
        for(int i=N-1;nc[i]==0;i--)
        {
            if(nc[i-1]!=0)
            {
                for(int j=i-1;j>=0;j--)
                    printf("%d",nc[j]);
                break;
            }
        }
        printf("\n");
    }
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

猜你喜欢

转载自blog.csdn.net/sinat_28941165/article/details/79918043