首页 > 代码库 > UVA - 471 Magic Numbers
UVA - 471 Magic Numbers
Description
Magic Numbers |
Write a program that finds and displays all pairs ofintegers and such that:
- neither nor have any digits repeated; and
- , whereN is a given integer;
Input and Output
The input file consist a integer at the beginning indicating the number of testcase followed by a blank line. Each test case consists of one line of input containingN. Twoinput are separated by a blank line.
For each input the output consists of a sequence of zero or more lines each containing/ = N, where andN are the integers described above. When there are two or more solutions, sort them by increasing numerator values.Two consecutive output set will separated by a blank line.
Sample Input
1 1234567890
Sample Output
1234567890 / 1 = 1234567890 2469135780 / 2 = 1234567890 4938271560 / 4 = 1234567890 6172839450 / 5 = 1234567890 8641975230 / 7 = 1234567890 9876543120 / 8 = 1234567890
题意:求除数和被除数都没有重复的数字,结果为N 的解
思路:首先回溯把所有可能的组成数字储存起来,然后判断去重就行了
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <set> using namespace std; typedef long long ll; vector<ll> sum; char vis[11]; void cal(ll cnt) { sum.push_back(cnt); for (ll i = 0; i <= 9; i++) { if (vis[i] == '1') continue; vis[i] = '1'; cal(cnt*10+i);; vis[i] = '0'; } } int check(ll num) { int tmp[10]; memset(tmp, 0, sizeof(tmp)); while (num) { int t = num%10; if (tmp[t]) return 0; tmp[t] = 1; num /= 10; } return 1; } int main() { for (ll i = 1; i <= 9; i++) { vis[i] = '1'; cal(i); vis[i] = '0'; } int t; ll n; scanf("%d", &t); while (t--) { scanf("%lld", &n); set<ll> ans; for (ll i = 0; i < sum.size(); i++) { if (sum[i]%n == 0) if (check(sum[i]/n)) ans.insert(sum[i]/n); } set<ll>::iterator it; for (it = ans.begin(); it != ans.end(); it++) { ll p = *it; printf("%lld / %lld = %lld\n", n*p, p, n); } if (t) printf("\n"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。