你能否将1,2,3……,10这10个数,在某些数前添加负号后,使这10个数的和为0?

如题所述

那是不可能的。
如果在两个数之间添+ -号,可以得到1或-1
但是10个数中只有5乘以2个数
如果取3个1,2个-1,则结果等于1
如果取2个1,3个-1,则结果等于-1
只有当数的个数为4的倍数时,在其中适当添加+ -号
才能得到0
因为最少只有4个相邻的数字才能得到0
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-10-02
不行。1+2+3....+10=55是奇数。
第2个回答  2007-10-02
//我用程序证明不可能
#include<stdio.h>

/*
你能否将1,2,3……,10这10个数,在某些数前添加负号后,使这10个数的和为0?
*/
/*
算法分析:
题目相当于从十个数任意选择一至10个数,使它们的和乘以负一,再与其它数相加
也等价于(1+2+3+...+10)-2*(选出来的数之和)
看看是否存在结果为0的情况
从十个数任选N个数是数学中的组合问题C(N, 10)

*/
#include <stdio.h>
int M;
int total = 0;
int nums = 55;//1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
int result = 0;//是否存在结果为result的情况,可以自定义
void pr(int s[])
{
int i = 0;
printf("第%d组解:\n\t", total++);
for(i = 0; i < M; i++)
{
printf("%d ", s[i]);
}
printf("\n");
}

void ZH(int n, int m, int s[])//这是组合的算法
{
int i,j;
if(m == 1)
{

for(i=s[1] + 1; i <= n; i++)
{
int temp = nums;
s[0]=i;
for(j=0; j < M; j++)
{//(1+2+3+...+10)-2*(选出来的数即s里面的数之和)
temp -= (2* s[j]);
}
if(temp == result)
{
pr(s);
}
}
}
else for(i=s[m]+1; i <= n; i++)
{
s[m - 1] = i;
ZH(n, m-1, s);
}
}
void main()
{
int s[100], n = 10, m = 0;

for(M = 1; M <= 10; M++)//从十个数中挑出M个数
{
s[M]=0;//s里面存放着挑出来的数
ZH(n, M, s);
}

printf("共有%d组解\n", total);
getchar();

}
相似回答