蓝桥杯暴力0到9恰好只出现一次问题

大家一定经常遇到0到9恰好只出现一次的问题;
不妨先看一个例题

“年龄的立方是个4位数。年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,多少岁?

看到这道题首先想到的是什么解题思路?暴力?十层循环?

其实有很简单的思路;

看我的解题代码

#include 
#include 
#include 
int arr[10] ;
int fun(int x){//判断是否出现两次
	while(x){
		arr[x%10]++;
		if(arr[x%10] > 1)
			return 0;
		x /= 10;
	} 
	return 1;
}

int main(int argc, char *argv[]) {
	int i, a, b;
	for(i=10; i<99; i++){
		memset(arr, 0, sizeof(arr));//这一步很关键,每次循环对arr数组初始化
		a = i*i*i;
		b = i*i*i*i;
		if(a>9999 || b>999999 || a<1000 || b<100000)
			continue;
		if(fun(a) && fun(b))//且的关系,每次运行都会改变arr数组里面的值
			printf("%d\n", i);
	} 	
}

仔细体会fun函数

你会有收获的

针对这一题其实还可以更简单:
https://blog.csdn.net/love_basketballer/article/details/79573704



**灵活运用**
例:https://blog.csdn.net/qq_27782065/article/details/50908267

#include 
#include 
#include 
int arr[10];
void fun(int x){
	int i;
	while(x){
		arr[x%10]++;
		x /= 10;
	}
}
int pd(){
	int i;
	if(arr[0] != 0)
		return 0;
	for(i=1; i<10; i++)
		if(arr[i] != 1)
			return 0;
	return 1;
}
int main(int argc, char *argv[]) {
	int i, j, k, t;
	for(i=173; i<987; i++){
		for(j=123; j<987; j++){
			memset(arr, 0, sizeof(arr));
			t = i + j;
			if(t>999 || t < 100)
				continue;
			fun(i);
			fun(j); 
			fun(t);
			if(pd())
				printf("%d + %d = %d\n", i, j, t);
		}
	}
}

你可能感兴趣的:(蓝桥杯暴力0到9恰好只出现一次问题)