征战蓝桥 —— 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;
}
原文地址:https://www.cnblogs.com/AlexKing007/p/12338847.html