2019蓝桥杯求余问题

判断一个的尾数 判断一个数所包含某数字
1.求尾数的情况相对简单 直接用所求的数与10取余(n%10),再进行判断即可。
2.求数中是否包含某数字的话,在求余判断的情况下还要判断是否已经到达数字的末位了。

下面用蓝桥杯的题目进行讲解
1.特别数的和小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574
请问,在1到n中,所有这样的数的和是多少
【输入格式】
输入一行包含两个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
40
【样例输出】
574
【评测用例规模与约定】
对于 20% 的评测用例, 1 ≤ n ≤ 10。
对于 50% 的评测用例, 1 ≤ n ≤ 100。
对于 80% 的评测用例, 1 ≤ n ≤ 1000。
对于所有评测用例, 1 ≤ n ≤ 10000。

解题思路:这是一道典型的求一个数是否包含某数字的问题,它的解法与上面2中所说的解法类似。我们应该先从尾数的情况开始考虑,对所求的数进行求模,看是否包含这个尾数。接着不断地与10相除,让它不断地取出上一位,这时再进行相应的判断(例如223%10的结果并不会满足尾数的情况,这时可以通过与10相除得到22,这时再与10求模,便可得知它是满足情况的解)。

核心代码

//判断尾数是否含有1,2,9,0
	public static boolean check(int n) {
		if(n%10==0||n%10==1||n%10==2||n%10==9) { 
			return true;
		}
		if((n/10==0)&&(n%10!=1||n%10!=2||n%10!=9)) { // 这里的n/10 是为了检测是否已经到达末位
			return false;
		}
		else
			return check(n/10); // 检测数字的上1位
	}

全部代码

public class 特别的数 {

	//判断尾数是否含有1,2,9,0
	public static boolean check(int n) {
		if(n%10==0||n%10==1||n%10==2||n%10==9) {
			return true;
		}
		if((n/10==0)&&(n%10!=1||n%10!=2||n%10!=9)) {
			return false;
		}
		else
			return check(n/10);
	}
	
	public static void main(String[] args) {
		int sum=0;
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		for(int i=1;i<=n;i++) {
			if(check(i)) {
				//System.out.print(i+" ");
				sum+=i;
			}
		}
		s.close();
		System.out.println(sum);
	}
}

2. 数的分解
【问题描述】把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和1001+1000+18 被视为同一种。

解题思路:同上(注意为了没有重复的分解方法应该确保分解出来的3个数a,b,c的大小为 a<b<c)
核心代码:

/**
	 * 检查每个正整数是否包含数字2 和4
	 * @param a
	 * @return
	 */
	public static boolean check(int a) {
		if(a/10==0&&a!=2&&a!=4) {// a/10检查是否已经是最后一位
			return true;
		}
		if(a%10==2||a%10==4) {
			return false;
		}
		else
			return check(a/10);
	}

全部代码

public class 数的分解 {

	public static void main(String[] args) {
		int count=0;
		for(int i=1;i<2019;i++) {
			if(check(i)) {
				for(int j=i+1;j<2019;j++) {
					if(check(j)) {
						int k=2019-i-j;
						if(k>j&&check(k)) {
							count++;
						}
					}
				}
			}
		}
		System.out.println(count);
	}
	/**
	 * 检查每个正整数是否包含数字2 和4
	 * @param a
	 * @return
	 */
	public static boolean check(int a) {
		if(a/10==0&&a!=2&&a!=4) {// a/10检查是否已经是最后一位
			return true;
		}
		if(a%10==2||a%10==4) {
			return false;
		}
		else
			return check(a/10);
	}

}

发布了19 篇原创文章 · 获赞 2 · 访问量 428

猜你喜欢

转载自blog.csdn.net/TheWindOfSon/article/details/103069671