【每日蓝桥】7、一三年省赛Java组真题“核桃的数量”

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:核桃的数量

小张是软件项目经理,他带领三个开发组,工期紧,今天都在加班呢,为鼓舞士气,小张打算给每个组发一袋核桃,(据传言能补脑),他的要求是:

  1. 各组的核桃数量必须相同

  2. 各组内必须能平分核桃,(当然是不能打碎的)

  3. 尽量提供满足1、2条件的最小数量(节约闹革命嘛)

程序从标准输入读入:

a b c

a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)

程序输出:

一个正整数,表示每袋核桃的数量

例如:

用户输入:

2 4 5

程序输出:

20

 

再例如:

用户输入:

3 1 1

程序输入:

3

 

资源约定:

峰值内存消耗(含虚拟机)<64M

CPU消耗  < 1000ms

请严格按要求输入,不要画蛇添足的打印类似:“请您输入...”的多余内容

所有代码放在同一个源文件中,测试通过后,拷贝提交该源码

注意:main函数需要返回0

注意:只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数

注意:所有依赖的函数必须明确的在源文件中,#include<xxx> 不能通过工程设置而忽略常用头文件

提交时,注意选择所期望的编译器类型

 

解题思路:

本题根据题干中的要求,我们可以推断出,这其实是求三个数的最小公倍数的问题,所以我们可以按照求解最小公倍数的方法来对题目进行解答。

在这里我列出了两种求解的方法,一种是较为简单的直接求解三个数的最小公倍数的方法,第二种是利用两个数的最小公倍数的求解算法进行解答,

同时在这里总结一下两个数的最小公倍数的求解方法:

两个数的最小公倍数 = 两数乘积 / 两数的最大公约数

求两数的最大公约数可以使用辗转相除法求解:
在这里列出Java的求解方法:

/**
* 求两个数的最小公倍数
 *
@param x y 传入的参数
 * */

public static int minMultiple(int a,int b) {
     return a*b/maxApp(a, b);
}

/**
 * 求两个数的最大公约数
 *
@param x, y 传入的参数
 * */

public static int maxApp(int a, int b) {
     if (a<b) {
          int temp = a;
          a = b;
          b = temp;
          }

     int r = a%b;
     while (r!=0) {
          a = b;
          b = r;
          r = a%b;
   }

          return b;
}

 

答案源码

解法一(直接求解):

public class Year2013_t7 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		int c = scanner.nextInt();
		
		for (int i = 1; i <= a*b*c; i++) {
			if (i%a==0&&i%b==0&&i%c==0) {
				System.out.println(i);
				break;
			}
		}
	}
}

解法二(求最小公倍数):

package 一三年省赛真题;

import java.util.Scanner;

public class Year2013_t7 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int a = scanner.nextInt();
		int b = scanner.nextInt();
		int c = scanner.nextInt();
		System.out.println(minMultiple(a, minMultiple(b, c)));
		
	}
	
	/**
	 * 求两个数的最小公倍数
	 * @param x y 传入的参数
	 * */
	public static int minMultiple(int a,int b) {
		return a*b/maxApp(a, b);
	}
	
	/**
	 * 求两个数的最大公约数
	 * @param x, y 传入的参数
	 * */
	public static int maxApp(int a, int b) {
		if (a<b) {
			int temp = a;
			a = b;
			b = temp;
		}
		int r = a%b;
		while (r!=0) {
			a = b;
			b = r;
			r = a%b;
		}
		return b;
	}
}

 

输出样例:

 

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

最后,我正在参加2020年度博客之星的评选,求小伙伴们帮忙投票支持一下哟!

投票链接:https://bss.csdn.net/m/topic/blog_star2020/detail?username=weixin_44985880

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/112694474