【蓝桥杯2014_C++】t3:神奇算式

神奇算式

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

比如:

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

都符合要求。

如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

这题就是直接做,先把所有的四位数枚举出来,然后筛选出符合条件的。

上代码:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <sstream>
 4 using namespace std;
 5 
 6 string i2s(int i){
 7     stringstream ss;
 8     string s;
 9     ss<<i;
10     ss>>s;
11     return s;
12 }
13 
14 void solve1(int i,int j,int k,int l){
15     int a = i;
16     int b = 100*j+10*k+l;
17     int c = a*b;
18     string s = i2s(c); 
19     if(s.find(i+'0')!=string::npos && s.find(j+'0')!=string::npos && s.find(k+'0')!=string::npos && s.find(l+'0')!=string::npos)
20         cout<<a<<"*"<<b<<"="<<c<<endl;
21 }
22 void solve2(int i,int j,int k,int l){
23     int a = 10*i+j;
24     int b = 10*k+l;
25     if(a>=b) return;  //两位数相乘的情况会出现满足乘法交换律的两组算式,排除其中一组 
26     int c = a*b;
27     string s = i2s(c);
28     if(s.find(i+'0')!=string::npos && s.find(j+'0')!=string::npos && s.find(k+'0')!=string::npos && s.find(l+'0')!=string::npos)
29         cout<<a<<"*"<<b<<"="<<c<<endl;
30 }
31 
32 int main(){
33     for(int i=1;i<=9;i++)
34         for(int j=0;j<=9;j++)
35             for(int k=0;k<=9;k++)
36                 for(int l=0;l<=9;l++){
37                     if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l){
38                         solve1(i,j,k,l);
39                         solve2(i,j,k,l);    
40                     }
41                 }
42     
43     return 0;
44 }

代码看起来很长,其实solve1和solve2几乎都是重复的,作为填空题无脑解法,写起来还是很快的。。

一开始两位数相乘那边忘了考虑乘法交换律,算出来有18组,把算式打印出来看了一下发现有重复的,于是又加了乘数a<b的条件。

string里找子串可以用str.find("xxx")!=string::npos; 还真忘了。。还查了下c++ reference来着orz。还看到有先把两个字符串排序再比较的,

还有就是'0'-'9'以内的字符和0-9以内的数字转换可以用char = int +'0';  int = char -'0'的方法~强转还是不太安全的,至少在devc++里会打印出奇怪的东西。。

打印出来有12组:

答案是12。

原文地址:https://www.cnblogs.com/Aikoin/p/10556462.html