给定数字N和M,你需要从数字1到N的序列中添加+或-,使得序列的和等于M。
打印出所有满足此关系的序列,例如,给定N=4 M=6,则满足条件得序列是1-2+3+4=6(一定存在此序列)
导师给我的题目,有趣,所以写写:
整理思路:
设1到n的所有数和为sum,而实际和是M,这里说明了有和为(sum-M)/2的数是被减去的而不是被加上的,列出所有这些数的组合就可以了。
贴代码,Java的:
import java.util.Scanner;
public class NM {
private static int m;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n,sum;
String s="1";//1是一定要用到的
n=sc.nextInt();
m=sc.nextInt();
sum=(sum(n)-m)/2;//这里的sum是我要组合的和
cou(2,n,sum,s);
}
private static void cou(int i, int n, int sum,String s) {
// TODO Auto-generated method stub
if(sum<i)return; //如果找到i了,比我凑的和要大,就不必走下去了
else if(sum==i) //凑到了,输出呗
{
s=s+"-"+i;
for(i=i+1;i<n+1;i++)
{
s=s+"+"+i;
}
System.out.println(s+"="+m);
return;
}
else
{
if(i==n)return;//超过要找的n就不必着了
cou(i+1,n,sum-i,s+"-"+i);//取i来凑sum的情况
cou(i+1,n,sum,s+"+"+i);//不取i来凑sum的情况
return;
}
}
//求和函数
private static int sum(int n) {
// TODO Auto-generated method stub
int x,sum=0;
for(x=1;x<n+1;x++)sum+=x;
return sum;
}
}