zoukankan      html  css  js  c++  java
  • 枚举+排序|神奇算式|2014年蓝桥杯A组题解析第三题-fishers

    标题:神奇算式

    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
    
    比如:
    

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

    都符合要求。
    
    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
    
    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
    

    这里的思路:枚举4个数字,判断两两数的乘积是否等于 这4个数组成的某个数字(判断相等,可以先用字符串排序,只要满足 A(a*b) == B(ab的各个位数组成的数,则满足条件)
    起初,没有想到这一点啊,就直接用暴力全部情况枚举一遍了(效率太低,写代码花时间太多了)

    还可以转成字符串,只要字符串相等就是一种方案。

    学会整数转字符串(sstream库):

        #include <sstream字符串流>
        #include <string>
    
        string src_str;
        stringstream ss;
        ss << a;
        ss >> src_str;
    
    

    介绍sstream字符串流的博文:https://www.cnblogs.com/wyuzl/p/6135537.html

    #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
    ", 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
    ", 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
    ", 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;
    }
    
  • 相关阅读:
    MVC+EasyUI 菜单导航的实现
    MVC4 +EasyUI 使用TreeGrid 方法
    MYSQL 内存报错 Use 'mysqld --thread_stack=#' to specify a bigger stack.
    System.Data.EntityState”在未被引用的程序集中定义
    android 学习第一天 了解事件机制,页面跳转等常用操作
    EasyUI TreeGrid DataTable转换数据实现案例
    王慧文清华大学的演讲的观点摘要
    《自由选择》
    优秀的工程师
    【mark】Windows Exploitation, post exploitation sites for reference
  • 原文地址:https://www.cnblogs.com/fisherss/p/10473040.html
Copyright © 2011-2022 走看看