加法变乘法
我们都知道: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);
}
}
总结:打开思路,多参考大神的代码,提高效率