• 征战蓝桥 —— 2014年第五届 —— C/C++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++;
                                        }
                                    }
                                }
                            }
                    }
            }
        }
    
        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;
    }
    

    简洁代码

    #include <iostream>
    #include <sstream>
    #include <algorithm>
    using namespace std;
    bool check(int num0,int num)
    {
    	string s1,s2;
    	stringstream ss0;
    	ss0<<num0;
    	ss0>>s1;
    	stringstream ss1;
    	ss1<<num;
    	ss1>>s2;
    	sort(s1.begin(),s1.end());
    	sort(s2.begin(),s2.end());
    	if(s1==s2) return true;
    	else return false;
    }
    int main()
    {
    	int ans=0;
    	for(int a=1;a<10;a++)
    	{
    		for(int b=0;b<10;b++)
    		{
    			if(b!=a)
    			{
    				for(int c=0;c<10;c++)
    				{
    					if(c!=a&&c!=b)
    					{
    						for(int d=0;d<10;d++)
    						{
    							if(d!=a&&d!=b&&d!=c)
    							{
    								int num0=a*1000+b*100+c*10+d;
    								int num1=a*(b*100+c*10+d);
    								int num2=(a*10+b)*(c*10+d);
    								if(check(num0,num1))
    								{
    									cout<<a<<" * "<<b*100+c*10+d<<" num1="<<num1<<endl;
    									ans++;
    								}
    								if(((a*10+b)<(c*10+d))&&check(num0,num2))
    								{
    									cout<<a*10+b<<" * "<<c*10+d<<" num2="<<num2<<endl;
    									ans++;
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	cout<<"ans="<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    华为网络层协议介绍
    华为交换机基本原理
    对网络布线与数制转换粗浅认识
    对 计算机网络参考模型新认识
    我对5G的初步认识
    三层交换机单臂路由
    同网段中不同vlan间,客户机从服务器中下载数据
    Telnet远程配置
    华为模拟器里使用RIP协议跨越主类网络边界的实验现象
    7.10 IP地址的格式 以及 网段地址等
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338849.html
Copyright © 2020-2023  润新知