UVA - 471 Magic Numbers

本文介绍了一个程序,用于找出给定整数N的所有整数配对,其中两个整数没有重复的数字。通过回溯算法生成所有可能的数字组合,然后筛选出符合条件的配对进行输出。

Description

Download as PDF


 Magic Numbers 

Write a program that finds and displays all pairs ofintegers tex2html_wrap_inline28 and tex2html_wrap_inline30 such that:

  1. neither tex2html_wrap_inline28 nor tex2html_wrap_inline30 have any digits repeated; and
  2. tex2html_wrap_inline36 , where N 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 containing N. Twoinput are separated by a blank line.

For each input the output consists of a sequence of zero or more lines each containing tex2html_wrap_inline28 / tex2html_wrap_inline30 = N, where tex2html_wrap_inline48 and N 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值