zoukankan      html  css  js  c++  java
  • 高精度乘法

    今天算是假期集训的第一天,第一次一整天只学信息,刺激啊~~~虽然很累,但是还是要整理一下嘛。

                                                           高精度

    之前学过高精度加法,所以不多说,直接出代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int main(){
        char a[205],b[205];
        int a1[205],m,c[205],b1[205],l2,l1,l,k=1;
        scanf("%s",a);
        scanf("%s",b);
        l1=strlen(a);
        l2=strlen(b);
        memset(c,0,sizeof(c));
        memset(a1,0,sizeof(a1));
        memset(b1,0,sizeof(b1));
        for(int i=0;i<l1;i++)
        {
            a1[l1-i-1]=a[i]-48;
        }
        for(int i=0;i<l2;i++)
        {
            b1[l2-i-1]=b[i]-48;
        }
        m=0;
        for(int i=0;i<max(l1,l2)+1;i++)
        {
            c[i]=a1[i]+b1[i]+m;
            m=c[i]/10;
            c[i]=c[i]%10;
        }
        l=max(l1,l2);
        for(int i=l;i>=0;i--)
        if(c[i]==0)l--;
        else
        break;
        for(int i=l;i>=0;i--)
        {
            cout<<c[i];
            k=0;
        }
        if(k==1)
        cout<<"0";
        return 0;
    }

    今天新学了一个高精乘法,总体思路是一样的,无非分为3个模块,分别是:读入数字,进行运算,输出得数。

    第一点,读入数字。和加法一样,读入一个字符串,再一一倒着转换为整形数组。(倒着存一是为了对齐末尾,二是为了方便)

    第二点,进行运算。核心代码段:


        for(int i = 1;i <= l1;i++)
        {
            x = 0;
            for(int j = 1;j <= l2;j++)
            {
                c[i + j - 1] = x + c[i + j - 1] + a[i] * b[j];
                x = c[i + j - 1] / 10;
                c[i + j - 1] %= 10;
            }
            c[i + l1] = x;
        }

    这个是整个代码的核心,主要难点是进位,进位解决了,整个程序就没什么难度了。(不要忘了  c[i + l1] = x; 进行最后一位的进位)

    最后输出得数,除了删除前导零,没什么难度。

    代码如下:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    char a1[100],b1[100];
    int a[100] = {0},b[100] = {0},c[205] = {0};
    int main()
    {
        int l1,l2,l,x;
        gets(a1);
        gets(b1);
        l1 = strlen(a1);
        l2 = strlen(b1);
        for(int i = 0;i < l1; i++)
        {
            a[l1 - i] = a1[i] - '0';
        }
        for(int i = 0;i < l2; i++)
        {
            b[l2 - i] = b1[i] - '0';
        }
        for(int i = 1;i <= l1;i++)
        {
            x = 0;
            for(int j = 1;j <= l2;j++)
            {
                c[i + j - 1] = x + c[i + j - 1] + a[i] * b[j];
                x = c[i + j - 1] / 10;
                c[i + j - 1] %= 10;
            }
            c[i + l1] = x;
        } 
        l = l1 + l2;
        for(int i = l;i > 1; i--)
        {
            if(c[i] != 0)
            break;
            else
            l--;
        }
        for(int i = l;i >= 1;i--)
        {
            cout<<c[i];
        }
        return 0;
    }
    只想找一个不会伤害我的人
  • 相关阅读:
    ConcurrentHashMap、Collections.synchronizedMap、Hashtable讨论(区别)java集合框架【3】 java1.5新特性
    struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解
    java抽象类详解以及与接口区别
    乐观锁理解
    URI和URL的区别
    JavaScript编程笔记
    2007年3月9日早上来到深圳……
    axWindowsMediaPlayer1控件循环播放方法
    C#中调用存储过程笔记(原)
    js日期选择控件(Asp.Net可用)
  • 原文地址:https://www.cnblogs.com/DukeLv/p/8321873.html
Copyright © 2011-2022 走看看