• 大数乘法


    算法提高 P1001  
    时间限制:1.0s   内存限制:256.0MB
        
      
      当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

    输入:
      62773417 12345678

    输出:
      774980393241726
     
     
    这个题目其实并不难的,重要的在于想法,其实当时自己想的确实什么大的偏差,只是还是见得少吧,所以迟迟没有做出了,后来研究了一下后,敲的代码反正总会有点意想不到的结果,然后就百度了一下这个题目的代码实现。 发现了不少优秀的代码,因为当时时直接把代码收集了很多一部分,就不再声明代码取处了,如有雷同,大家共同学习,不要见怪哈.
     
    这是第一个:
    #include<stdio.h>
    #include<string.h>
    char s1[20],s2[20];
    int a1[20],a2[20],result[25];
    int l1,l2,i,j;
    void mul()
    {
        memset(result,0,sizeof(result));
        for(i=0; i<l1; i++)
            for(j=0; j<l2; j++)
            {
                result[i+j]+=a1[i]*a2[j];
            } 
        for(i=0; i<l1+l2-1; i++)
        {
            result[i+1]+=result[i]/10;
            result[i]%=10;
        }
        if(result[l1+l2-1]!=0)
            printf("%d",result[l1+l2-1]);
        for(i=l1+l2-2; i>=0; i--)
            printf("%d",result[i]);
        printf("
    ");
    }
    int main()
    {
        scanf("%s%s",s1,s2);
        memset(a1,0,sizeof(a1));
        l1=strlen(s1);
        for(i=0; i<l1; i++)
        {
            a1[l1-1-i]=s1[i]-'0';
        }
        memset(a2,0,sizeof(a2));
        l2=strlen(s2);
        for(i=0; i<l2; i++)
        {
            a2[l2-1-i]=s2[i]-'0';
        }
        if(((l1==1)&&(a1[0]==0))||((l2==1)&&(a2[0]==0)))
            printf("0
    ");
        else
            mul();
        return 0;
    }

    还有第二个:

    #include <stdio.h>  
    #include <string.h>  
    int main()  
    {  
        int i = 0, j = 0, len1 = 0, len2 = 0, len3 = 0, temp = 0,flag = 1;  
        char strNum1[1000],strNum2[1000],strNum3[2000];  
        int nNum[1000]={0};  
        gets(strNum1); 
        gets(strNum2);  
      
        len1 = strlen(strNum1); 
        len2 = strlen(strNum2);  
        len3 = len1+len2+1;  
        temp = len3;  
           //相乘
        for (i = len2-1; i >= 0; --i)  
        {  
            temp = (--len3);  
            for (j = len1-1; j >= 0; --j)  
            {  
                nNum[temp--] += (strNum2[i]-'0') * (strNum1[j]-'0');  
            }  
        }  
      
        len3 = len1+len2+1;  
      
        //进位
        for (i = len3; i > 0; --i)  
        {  
            while (nNum[i]>9)  
            {  
                nNum[i-1]+=nNum[i]/10;  
                nNum[i] = nNum[i]%10;  
            }  
        }  
      
        for (i = 0; i < len3; ++i)  
        {  
            if (nNum[i] == 0 && flag == 1)
            {  
                continue;  
            }  
            else  
            {  
                flag = 0;  
            }  
            printf("%d",nNum[i]);  
        }  
        printf("
    ");  
        return 0;  
    }  

    贴出仅供反思及与大家共同学习,交流

  • 相关阅读:
    MySQL主从配置
    MySQL操作
    初识数据库
    Session对象以及其常用的方法
    请求重定向与请求转发的区别
    JSP respone常用方法
    解决JSP url传值中文乱码问题
    JSP request 对象
    JSP 内置对象get 和 post的区别
    jsp out对象
  • 原文地址:https://www.cnblogs.com/zhangzimu/p/6217288.html
Copyright © 2020-2023  润新知