Hướng dẫn giải của Phép nhân

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Tác giả: phucvnaoke

Lỗi thường gặp

Theo như các bước đề bài đã đề cập:

Bước 2: Nhân hàng đơn vị của số ở dưới với số ở trên.

Bước 3 (Nếu có): Nhân hàng chục của số ở dưới với số ở trên. Viết từ phải qua trái, khi viết cần lùi lại một cột so với tích riêng phía trên.

Bước 4 (Nếu có): Lặp lại tương tự so với các hàng trăm, hàng ngàn, hàng chục ngàn,...

Nghĩa là ta phải nhân lần lượt các chữ của số ở dưới với số ở trên theo thứ tự từ phải qua trái. Mỗi lần nhân ghi lùi vào một dòng so với bên phải, nghĩa là ta phải căn lề phải.

Lưu ý: phải nhân chữ số ở dưới với cả số số ở trên. Không phải nhân các chữ số ở dưới với các chữ số ở trên.

Ví dụ phép nhân:

image

Trình bày đúng sẽ là:

image

Lưu ý: ở đây tích riêng thứ hai là $0$, không phải là $0000$. Vì ta nhân hàng chục của số dưới với số ở trên, là lấy $0 \times 7856$.

Code tham khảo

Xử lý bằng $int128$

phucvnaoke

#include <bits/stdc++.h>
using namespace std;

#define int long long

string ITOS(__int128 x) {
    string s = "";
    while (x != 0) {
        s += (x % 10) + '0';
        x /= 10;
    }
    reverse(s.begin(), s.end());
    return s;
}

main() {
    ios::sync_with_stdio(0); 
    cin.tie(0);
    int a, b;
    char aa;
    cin >> a >> aa >> b;
    if (b > a) swap(a, b);
    __int128 ab = (__int128)a * (__int128)b;
    int n = ITOS(ab).length();
    string sa = to_string(a);
    string sb = to_string(b);
    for (int i = 0; i < n - sa.length(); i++) cout << "#";
    cout << sa << endl;
    cout << aa;
    cout << endl;
    for (int i = 0; i < n - sb.length(); i++) cout << "#";
    cout << sb << endl;
    for (int i = 0; i < n; ++i) cout << "-";
    cout << endl;

    int cnt = 0;
    for (int i = sb.length() - 1; i >= 0; --i) {
        string s;
        s = to_string((sb[i] - '0') * a);
        while (s.length() < n - cnt) s = "#" + s;
        cnt++;
        cout << s << endl;
    }

    for (int i = 0; i < n; ++i) cout << "-";
    cout << endl;

    cout << ITOS(ab) << endl;
}
Xử lý bằng xâu

Stephen

#include <bits/stdc++.h>

using namespace std ;


int main() {
    ios_base::sync_with_stdio(0) ;
    cin.tie(nullptr) ;
    cout.tie(nullptr) ;
    string s ;
    getline(cin, s) ;
    stringstream ss(s) ;
    string tmp ;
    vector<string> st , ans ;
    while(ss >> tmp) {
        st.push_back(tmp) ;
    }
    if(st[0] < st[2]) swap(st[0] , st[2]) ;
    if(st[0].size() < st[2].size()) swap(st[0] , st[2]) ;
    long long a = stoll(st[0]) , b = 0;
    int n = 0 ;
    for(int i = 0 ; i < st[2].size() ; i ++) {
        b = a * 1ll * (st[2][i] - '0');
        string tt = to_string(b) ;
        for(int j = i ; j < st[2].size() ; j ++) tt += "." ;
        ans.push_back(tt) ;
        n = max(n , int(tt.size())) ;
    }
    for(int i = 0 ; i < ans.size() ; i ++) {
        while(ans[i].size() < n) {
            ans[i] = "#" + ans[i] ;
        }
    }
    n -- ;

    //
    int du = 0 ;
    vector<long long> res ;
    for(int i = n - 1 ; i >= 0 ; i --) {
        int tmp2 = du ;
        for(int j = ans.size() - 1 ; j >= 0 ; j --){
            if(ans[j][i] == '.' || ans[j][i] == '#') continue ;
            tmp2 += (ans[j][i] - '0') ;
        }
        res.push_back(tmp2 %10) ;
        du = tmp2 / 10 ;
    }
    int cnt = res.size() ;
    if(du) cnt ++ ;
    if(cnt > n) {
        n ++ ;
        for(int i = 0 ; i < ans.size() ; i ++) ans[i] = "#" + ans[i] ;
    }
    while(st[0].size() < n) {
        st[0] = "#" + st[0] ;
    }
    while(st[2].size() < n) {
        st[2] = "#" + st[2] ;
    }
    cout << st[0] << "\n" ;
    cout << "x\n" ;
    cout << st[2] << "\n" ;
    for(int i = 0 ; i < n; i ++) cout << '-' ;
    cout << "\n" ;
    for(int i = ans.size() - 1 ; i >= 0 ; i --) {
        for(int j = 0 ; j < ans[i].size() ; j ++) {
            if(ans[i][j] == '.') break ;
            cout << ans[i][j] ;
        }
        cout << "\n" ;
    }
    for(int i = 0 ; i < n; i ++) cout << '-' ;
    cout << "\n" ;

    //
    if(du != 0) cout << du ;
    for(int i = res.size() - 1 ; i >= 0 ; i --) {
        cout << res[i] ;
    }
    return 0 ;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.

Hỗ Trợ CLAOJ
QR Code