蓝桥杯简单题---寻找三位数

该文提供了解决蓝桥杯算法问题的C语言代码,主要目标是找到一个三位数,其每一位数字都不同,且无零。通过循环遍历并使用数组记录已出现的数字,用排除法判断不符合条件的数,同时检查数字的两倍和三倍也需满足条件。
摘要由CSDN通过智能技术生成

蓝桥杯算法提高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,还可以判断数字中各个数字是否被查找过

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值