【蓝桥杯 加法变乘法】沙雕深搜&大神代码

18 篇文章 0 订阅

加法变乘法

我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015

比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。

请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
答案:16
注意:需要你提交的是一个整数,不要填写任何多余的内容。


这次为什么写这个题呢?没有比较就没有逼数,先上大神思路,几行代码就能解决该问题

原文链接:https://blog.csdn.net/qq_30258957/article/details/79647488

public static void main(String[] args) 
{ 
    for (int i = 1; i < 49; i++) 
    { 
        for (int j = i; j < 49; j++) 
        { 
            if((1225-i*2-j*2-2)+i*(i+1)+j*(j+1)==2015) 
                    System.out.println(i); 
        } 
    } 
}

M:马上就得出结果10 & 16,for (int i = 1; i < 49; i++) {的49是哪里来的呢?

Z:乘号左边的数,也就两个,所以我们假设它是i & j 。可能的情况各自为49种。所以用双层循环将两种情况都遍历出来。

M:那if((1225-i*2-j*2-2)+i*(i+1)+j*(j+1)==2015) 是怎么验证这两种情况是符合的呢?

Z:这是1+2+3+ ... + 49 = 1225的变种,改变两个数让它的结果变成2015。

也就是说,减去原来两个数。原来两个数,为i + (i+1) + j + (j+1)。

而新增的两个数为他们的乘法 i * (i+1)+ j * (j+1)

所以式子就变成了 (1225-i*2-j*2-2)+i*(i+1)+j*(j+1)==2015

M:总结一下,这道题的做法就是利用它改变的值是可以穷举的,通过 穷举 + 式子变形 的方式,算出i,j的值。


我的沙雕深搜代码

public class 加法变乘法 {
	
	public static boolean check(int m,int n)
	{
		if(m>=1&&m<49&&n>=1&&n<49&&m+1<n)
		{
			int sum1 = (m-1)*(1+m-1)/2;
			int sum2 = m*(m+1);
			int sum3 = (n-m-2)*(m+2+n-1)/2;
			int sum4 = n*(n+1);
			int sum5 = (49-(n+2)+1)*(n+2+49)/2;
			int sum = sum1+sum2+sum3+sum4+sum5;
			if(sum==2015)
				return true;
		}
		return false;
	}
	
	public static void dfs(int m,int n)
	{
		if(m==10&&n==27)
			return;
		if(m+1>=n||n>48)
			return;
		if(check(m,n))
		{
			System.out.println(m+" "+n);
			return;
		}
		else
		{
			dfs(m,n+1);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		for(int i = 1;i<=46;i++)
			dfs(i,i+2);
	}

}

总结:打开思路,多参考大神的代码,提高效率

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值