记录自己的思考
虽然暴力求解,但不能一味地枚举所有可能,要尽可能的发现题目中暗藏的窍门,利用之简化解题思路。
例如在本题中,通俗的方法可以枚举所有的10位数的排列,但数据量会达到10!.
巧用数组
判断数字不相同,可以巧用数组。将数字本身作为下标,判断值的变化。很妙的一种用法。
总结
内容较少,总的来说,就是要多做题,多看大佬们的代码,从中学习技巧。
题目链接:https://vjudge.net/problem/UVA-725
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int a[12];
bool diff_all(int x, int y){
memset(a,0,sizeof(a));//重置
if(y>99999)
return false;
for(int i=0;i<5;i++){
a[x % 10] ++;
a[y % 10] ++;
x /= 10;
y /= 10;
}
for(int i = 0;i < 10;i++){
if(a[i] != 1)
return false;
}
return true;
}
int main(){
int n;
int kase = 0;
while(scanf("%d",&n)&&n){ //当n为0时,输入结束
if(kase > 0)
printf("\n");
kase ++;
bool flag = false;
for(int i=1234;i<=99999;i++){
if(diff_all(i, i * n)){
flag = true;
printf("%05d / %05d = %d\n", n * i, i, n);
}
}
if(!flag){
printf("There are no solutions for %d.\n",n);
}
}
}