题目描述:
算法提高 连接乘积
时间限制:1.0s 内存限制:256.0MB
问题描述
192这个数很厉害,用它分别乘以1、2、3,会得到:
192 x 1 = 192
192 x 2 = 384
192 x 3 = 576
把这三个乘积连起来,得到192384576,正好是一个1~9的全排列
我们把上面的运算定义为连接乘积:
m x (1 ... n) = k(其中m > 0 且 n > 1,对于上例,m = 192、n = 3、k = 192384576)
即k是把m分别乘以1到n的乘积连接起来得到的,则称k为m和n的连接乘积。
按字典序输出所有不同的连接乘积k,满足k是1~9的全排列
输出格式
每个k占一行
样例输出
显然,结果中应包含一行:
192384576
程序代码:
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; vector<string> ans; string s[]={"0","1","2","3","4","5","6","7","8","9"}; string ToString(int n) { string ans; while(n) { ans+=s[n%10]; n/=10; } reverse(ans.begin(),ans.end());//逆转字符序列 return ans; } int check(string str) { int vis[10]; memset(vis,0,sizeof(vis)); for(int i=0;i<str.size();i++) vis[str[i]-'0']++;//记录1到9出现的次数 if(vis[0]>0)//如果出现了0,就是不符合题意 return 0; for(int i=1;i<10;i++) { if(vis[i]!=1)//只要1到9有一个出现次数不为1 return 0; } return 1;//当且仅当1到9每个都只出现了1次 } int main() { for(int i=1;i<9999;i++) { string str; for(int j=1;j<10;j++) { str=str+ToString(i*j);//C++字符串拼接 if(check(str)) { ans.push_back(str);//将每个符合的串str添加到ans之后 break; } } } sort(ans.begin(),ans.end());//最后直接sort for(int i=0;i<ans.size();i++) cout<<ans[i]<<endl; return 0; }