藍橋杯-神奇算式(2014-A-3)

標題:神奇算式

由4個不同的數字,組成的一個乘法算式,它們的乘積仍然由這4個數字組成。

比如:

210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187

都符合要求。

如果滿足乘法交換律的算式算作同一種情況,那麼,包含上邊已列出的3種情況,一共有多少種滿足要求的算式。

請填寫該數字,通過瀏覽器提交答案,不要填寫多餘內容(例如:列出所有算式)。

代碼:

#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>

bool check(int src, int r);

using namespace std;
int ans;

int main(int argc, const char *argv[]) {
    for (int i = 1; i < 10; ++i) {
        for (int j = 0; j < 10; ++j) {
            if (i != j)
                for (int k = 0; k < 10; ++k) {
                    if (k != i && k != j)
                        for (int l = 0; l < 10; ++l) {
                            if (l != i && l != j && l != k) {
                                int src = i * 1000 + j * 100 + k * 10 + l;//ijkl四位數
                                //驗證
                                if (j != 0) {
                                    int r1 = i * (j * 100 + k * 10 + l);//乘法結果
                                    if (check(src, r1)) {
                                        printf("%d * %d\n", i,j * 100 + k * 10 + l);
                                        ans++;
                                    }
                                }
                                //驗證
                                if (k != 0) {
                                    int r2 = (i * 10 + j) * (k * 10 + l);//乘法結果
                                    if ((i * 10 + j)< (k * 10 + l)&&check(src, r2)) {
                                        printf("%d *   %d\n", i * 10 + j, k * 10 + l);
                                        ans++;
                                    }
                                }
//                                if (l != 0) {
//                                    int r3 = (i * 100 + j * 10 + k) * (l);//乘法結果
//                                    if (check(src, r3)) {
//                                        printf("%d * %d\n", i * 100 + j * 10 + k,  l);
//                                        ans++;
//                                    }
//                                }
                            }
                        }
                }
        }
    }

    cout << ans << endl;
    return 0;
}

bool check(int src, int r) {
//    先轉字符串,排序,比較
    string src_str, r_str;
    stringstream ss;
    ss << src;
    ss >> src_str;
    stringstream ss1;
    ss1 << r;
    ss1 >> r_str;
    sort(r_str.begin(), r_str.end());
    sort(src_str.begin(), src_str.end());
    if (r_str == src_str) {
        return true;
    }
    return false;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章