大家一定经常遇到0到9恰好只出现一次的问题;
不妨先看一个例题
“年龄的立方是个4位数。年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,多少岁?
看到这道题首先想到的是什么解题思路?暴力?十层循环?
其实有很简单的思路;
看我的解题代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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);
}
}
}