zoukankan      html  css  js  c++  java
  • 征战蓝桥 —— 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;
    }
    
  • 相关阅读:
    js正則表達式语法
    购买DigtalOcean VPS 以及 连接Linux
    UVA 246
    牵一发动全身【Nhibernate基本映射】
    jquery.validate+jquery.form提交的三种方式
    [Python] 发送email的几种方式
    递归算法浅谈
    最小二乘法多项式曲线拟合原理与实现
    王立平-Android中对图像进行Base64编码
    [置顶] EasyMock的简单使用
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338848.html
Copyright © 2011-2022 走看看