栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

蓝桥杯真题c语言(蓝桥杯c语言试题与答案详解)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯真题c语言(蓝桥杯c语言试题与答案详解)

 思路

这里有三个数字 我们称 a+ c = c 且各个位上的数字不同。我们这里借助桶排序的思想来判断 1-9 这些数字有没有占用。

所以我们定义一个判断函数,用于判断 a b c三个数字是否符合要求。

然后暴力枚举:

a 从 123 到 987 开始枚举

有很多同学开始抬杠 111-999 岂不是更简单,因为 123 是最小的符合要求的数字,可以减少枚举的次数,987 是最大的符合要求的数字。

b 从 123 到 987-a枚举

这时候又会有很多同学来问,为什么不直接枚举与 a 不一样的数字呢,那么又得考虑每一位的问题,这样的模拟已经不是暴力法了,我们要做的就是在不改变完成难度的情况下,减少复杂度。所以要分清注次。

c = a+ b 这时候只要检查a b c 是否符合要求即可。 代码

package easy;

public class 算式问题 {
	static int[] arr = new int[10]; //0-9
	public static void main(String[] args) {
		int sum = 0;
		for (int a = 123; a < 987; a++) {
			for (int b = 123; b < 987-a; b++) {
				int c = a + b;
				if (check(a, b, c) == 1) {
					sum++;
				}
				System.out.println(a+"+"+b+"="+c);
				System.out.println(sum);
			}
		}
	}
	static int check(int a,int b,int c) {
		
		for (int i = 0; i < arr.length; i++) {
			arr[i] = 0; //桶排序 让每个数出现的次数为0
			arr[0] = 1; //题目要求不包括0 所以让0出现一次 之后就会排除0
		}
		
		//当首字母不为0 进入while循环
		while (a != 0) {
			
            //首先判断每一个数的最后一个位
			if (arr[a%10] == 1) {
				//首先判断一下arr[a%10]的次数是不是0 如果不是就继续 如果是就 说明该数已经出现了
				return 0;
			} else {
				 arr[a%10] = 1;
			}
			if (arr[b%10] == 1) {
				return 0;
			} else {
				 arr[b%10] = 1;
			}
			if (arr[c%10] == 1) {
				return 0;
			} else {
				 arr[c%10] = 1;
			}
            //把每一个数的最后一位去掉 接着循环判断
			a = a/10;
			b = b/10;
			c = c/10;
		}
		return 1;
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号