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

小虾同学發表於2024-07-06

本節課作業:

連結:https://pan.baidu.com/s/13-FC86jSHGziRDA8lqzimg?pwd=owv1
提取碼:owv1

高精度乘法

  

c++ u7-02-高精度乘法
#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

c++ u7-02-高精度乘法
#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

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

c++ u7-02-高精度乘法
#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