蓝桥杯算法提高VIP-寻找三位数 - C语言网 (dotcpp.com)
1,首先我们要让他的每一位都不相同
2.我们可以经过计算知道,他的第一个数字的范围是123到329之间
3.我们可以想象到我们需要进行循环来遍历者之间的所有数进行判断
4、判断是否有重复出现的数字,我们使用数组记录已经出现的数字
num[10]={0,1,1,1,1,1,1,1,1,1};我们要将首位元素置为0
每个数字都不能为0
5.像这种需要的是满足要求的数字,我喜欢用排除法----只写判断不符合的情况,
个位,十位,百位各不相等
当数字中不能出现0
各个数字各不相同
解决方案如下:
#include<stdio.h>
int main()
{
int i=0;
int gw,sw,bw;
//像这种程序应该写的是终止进入下一个玄幻的条件
for(i=123;i<=329;i++)
{
int num[10]={0,1,1,1,1,1,1,1,1,1};//如果三个数但凡相同,对应的数组中的数但饭大于2
gw=i%10;
bw=i/100;
sw=i/10%10;
if(gw==sw||gw==bw||sw==bw)
continue;
if(num[gw]*num[sw]*num[bw]>1||num[gw]*num[sw]*num[bw]==0)//这里判断一定要是或因为这两个都是不符的情况
continue;
//来到这里的就是符合条件的
num[gw]++;
num[sw]++;
num[bw]++;
//判断下一个数
int a=i*2;
gw=a%10;
bw=a/100;
sw=a/10%10;
if(gw==sw||gw==bw||sw==bw)
continue;
if(num[gw]*num[sw]*num[bw]>1||num[gw]*num[sw]*num[bw]==0)
continue;
//来到这里的就是符合条件的
num[gw]++;
num[sw]++;
num[bw]++;
//判断下一个数
int b=i*3;
gw=b%10;
bw=b/100;
sw=b/10%10;
if(gw==sw||gw==bw||sw==bw)
continue;
if(num[gw]*num[sw]*num[bw]>1||num[gw]*num[sw]*num[bw]==0)
continue;
//来到这里的就是符合条件的
num[gw]++;
num[sw]++;
num[bw]++;
//到这里就是符合题目要求的值
printf("%d %d %d\n",i,a,b);
}
return 0;
}
还有一种可以在每个数字的第二种判断中少判断一下
#include<stdio.h>
int main(void)
{
int a,b,c,gw,sw,bw;
for(a=123;a<=329;a++)//由a的取值范围开始逐一判断是否满足条件
{
int arr[10]={0,1,2,3,4,5,6,7,8,9};//这里最好把下标,元素值二者相等
//先判断a;
gw=a%10;//取出个位
sw=a%100/10;//取出十位
bw=a/100;//取出百位
if(gw==sw||gw==bw||sw==bw)//先判断这个三位数中三个数有没有重复的
{
continue;
}
if(arr[gw]*arr[sw]*arr[bw]==0)//再判断对应下标的元素有没有值为0,如果三个数中一个数为0就直接进行下一次循环
{
continue;
}
arr[gw]=arr[sw]=arr[bw]=0;//把对应下标的元素赋值为0;
//同样的方式对b进行判断
b=2*a;
gw=b%10;
sw=b%100/10;
bw=b/100;
if(gw==sw||gw==bw||sw==bw)
continue;
if(arr[gw]*arr[sw]*arr[bw]==0)
{
continue;
}
arr[gw]=arr[sw]=arr[bw]=0;
//同样的方式对c进行判断
c=3*a;
gw=c%10;
sw=c%100/10;
bw=c/100;
if(gw==sw||gw==bw||sw==bw)
continue;
if(arr[gw]*arr[sw]*arr[bw]==0)
{
continue;
}
//上面已经判断完了,符合条件的就可以在下面直接输出
printf("%d %d %d\n",a,b,c);
}
return 0;
}
这段代码的好处是使用0来标记已经查找过得数
如果相乘为0,既可以判断数字中是否含有0,还可以判断数字中各个数字是否被查找过