Java教程

第一个程序--高精度乘法

本文主要是介绍第一个程序--高精度乘法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

高精度乘法(注释写的应该算是比较详细了

#include<iostream>
#include<cstdio>
using namespace std;
const int N=105;
int ans[2*N];
int findLen(char c[]){
    for(int k=0;k<N;k++){
        if(c[k]<'0'){
            return k;
        }
    }
    return -1;
}
void reverseArr(char c[],int len){
    int tmp;
    for(int k=0;k<len/2;k++){
        tmp=c[k];
        c[k]=c[len-k-1];
        c[len-k-1]=tmp;
    }
}
int main(){
    char a[N],b[N];
    //养成习惯,对代码进行必要的注释
    //M位数*N位数最大位数为M+N,M位数*N位数最小位数为M+N-1————》确定结果位数
    //由于乘数位数过高,均使用数组存放,并记录乘数数组有效长度

    //输入
    scanf("%s",a);
    scanf("%s",b);
    //寻找数组有效长度
    int len_a=findLen(a),len_b=findLen(b);
    //初步处理数据--》位置倒转
    reverseArr(a,len_a);
    reverseArr(b,len_b);
    //核心算法
    for(int i=0;b[i]>='0';i++){//乘数
        for(int j=0;a[j]>='0';j++){//被乘数
            ans[i+j]+=(b[i]-48)*(a[j]-48);
        }
    }
    // 对数据进行最终处理
    for(int k=0;k<len_a+len_b-1;k++){
        ans[k+1]+=ans[k]/10;
        ans[k]%=10;
    }
    //输出结果
    if(ans[len_a+len_b-1]>0){
        cout<<ans[len_a+len_b-1];
    }
    for(int k=len_a+len_b-2;k>=0;k--){
        cout<<ans[k];
    }
    return 0;
}

 

额外收获:

  • 当使用scanf输入字符串时,space和enter都能中断输入,且中断字符不会被输入。
  • 中断字符(space/enter)不会影响下一个scanf。
  • 全局数组将自动完成初始化,字符数组默认为空,整型数组默认为0。
  • 局部数组不会初始化,所以不能使用数组没有初始化的位置的值。
  • scanf/printf来自于<cstdio>头文件。
这篇关于第一个程序--高精度乘法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!