c++ u7-02-高精度乘法

小虾同学 / 2024-07-08 / 原文

本节课作业:

链接:https://pan.baidu.com/s/13-FC86jSHGziRDA8lqzimg?pwd=owv1
提取码:owv1

 

 

 

高精度乘法

 

 

 

 

 

 

 

 

 

 

 

   

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string x , y;
int a[50010] , b[50010] , c[50010];
int main()
{
    cin >> x >> y;
    int l1=x.size() , l2 = y.size();
    for(int i = 1 ; i <= l1 ; i++){
        a[i] = x[l1-i]-'0';    
    }
    
    for(int i = 1 ; i <= l2 ; i++){
        b[i] = y[l2-i]-'0';    
    }
    for(int i = 1 ; i <= l1 ; i++){
        for(int j = 1 ; j <= l2 ; j++){
            c[i+j-1] += a[i] * b[j];
        }
    }
    int l = l1 + l2;
    for(int i = 1 ; i <= l - 1 ; ++i){
        if(c[i] > 9){
            c[i+1] += c[i] / 10;
            c[i] %= 10;    
        }
    }
    while(c[l] == 0 && l > 1){
        l--;    
    }
    for(int i = l ; i >= 1 ; i--){
        cout << c[i];    
    }
    return 0;
} 
View Code

 

 

 

#include<bits/stdc++.h>  
using namespace std;  
  
// 初始化两个数组,mul用于存储每一步的乘积,add用于存储乘积的各位数字之和的累积和  
int mul[10010] = {1}, add[10010];  
  
int main(){  
    int n, l = 2; // n是输入的数字,l是当前mul数组的长度(包括预留空间)  
    cin >> n; // 读取n的值  
  
    // 外层循环:从1乘到n  
    for(int i = 1; i <= n; i++){  
        // 内层循环1:计算当前的乘积  
        for(int j = 0; j < l; j++){  
            mul[j] *= i; // 将当前索引的值乘以i  
        }  
  
        // 更新l的值,为可能的进位预留空间  
        // 注意:这里简单地将l增加2可能不是最优的,但在这个例子中足够了  
        l += 2;  
  
        // 内层循环2:处理进位  
        for(int j = 0; j < l; j++){  
            // 将当前位的进位加到下一位  
            mul[j + 1] += mul[j] / 10;  
            // 更新当前位的值(去掉进位)  
            mul[j] %= 10;  
        }  
  
        // 初始化add数组的这一轮计算(理论上这一步不是必需的,因为add数组会被累加)  
        // 但为了清晰起见,可以在这里明确设置add数组的前l位为0(尽管它们可能已经是0了)  
  
        // 内层循环3:计算当前乘积的各位数字之和,并累加到add数组上  
        for(int j = 0; j < l; j++){  
            add[j] += mul[j]; // 将mul数组的当前位加到add数组的对应位上  
            // 处理add数组的进位  
            add[j + 1] += add[j] / 10;  
            add[j] %= 10; // 更新add数组的当前位(去掉进位)  
        }  
  
        // 注意:这里我们不需要重置mul数组或l的值,因为它们是累积计算的  
    }  
  
    // 找到add数组中最后一个非零元素的索引  
    int idx = l - 1; // 从最后一个元素开始检查  
    while(idx >= 0 && add[idx] == 0) idx--;  
  
    // 输出结果  
    // 从idx开始,逆序输出add数组中的元素  
    for(int i = idx; i >= 0; i--) cout << add[i];  
    cout << endl; // 可选:在输出结束后添加换行符  
  
    return 0;  
}
View Code

 

 

 

高精度除法   高精度除低精度

 

 

 

 

 

 

 

 

#include <iostream>
using namespace std;
int a[10010], b, c[10010];

int main() {
    string s1;
    cin >> s1 >> b;
    int l1 = s1.size();
    for (int i = 0; i < l1; i++)
        a[i] = s1[i] - '0';
    long long r = 0;
    for (int i = 0; i < l1; i++) {
        r = a[i] + r * 10;
        c[i] = r / b;
        r %= b;
    }
    int len = 0;
    while(!c[len]){
        len++;        
    }    
    for (int i = len; i < l1; i++){
        cout << c[i];    
    }    
        cout << endl << r;    
    return 0;
}
View Code