第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();
}