第十届蓝桥杯省赛Java B组 数的分解

Posted 覃会程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十届蓝桥杯省赛Java B组 数的分解相关的知识,希望对你有一定的参考价值。

试题 D: 数的分解

本题总分:10 分
【问题描述】
把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包
含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和
1001+1000+18 被视为同一种。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解题思路:
暴力枚举,由于ABC三个数的排序有六种可能,所以结果要除六。

public class test4
    public static boolean judge(int num)
        while(num>0)
            int k=num%10;
            if(k==2 || k==4)
                return false;
            
            num/=10;
        
        return true;
    
    
    public static void main(String[] args)    
        long result=0;
        for(int i=1;i<2019;i++)
            for(int j=1;j<2019;j++)
                for(int k=1;k<2019;k++)
                    if(i+j+k==2019)
                        if(i!=j && i!=k && j!=k)
                            if(judge(i) && judge(j) && judge(k))
                                result++;
                            
                        
                    
                
            
        
        System.out.println(result/6);
    


上面的代码耗时比较长,下面进行优化,优化后的代码如下:

public class test 
	public static void main(String[] args)
		int a, b, c;
		int sum = 0;
		for(int i=1; i<2019; i++)
			a = i;
			int k = 2019 - i;
			for(int j=i; j<=k; j++)
				b = j;
				c = 2019 - a - b;   //用前两个数确定的三个数
				if(a==b || a==c || b==c) continue;
				if(a+b+c != 2019)  continue;
				if((a+" ").contains("2")||(a+" ").contains("4"))  continue;
				if((b+" ").contains("2")||(a+" ").contains("4"))  continue;
				if((c+" ").contains("2")||(a+" ").contains("4"))  continue;
				sum++;  //contains()用于判断是否包含指定字符串
			
		
		System.out.println(sum/6);
	

以上是关于第十届蓝桥杯省赛Java B组 数的分解的主要内容,如果未能解决你的问题,请参考以下文章

第十届蓝桥杯省赛B组 做题记录(python)

第十届蓝桥杯省赛B组 做题记录(python)

第十四届蓝桥杯省赛c/c++大学B组题解

第十二届蓝桥杯省赛第二场C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~

蓝桥杯省赛C++组别大学B组历年题解

蓝桥杯省赛C++组别大学B组历年题解