求高手帮忙:已知一个总和,怎么从一串数字中找出哪几个数相加等于这个总和?
数字有3003000351126281555494561083512194636441520259030113904228913711915189912902707115...
数字有300 3000 3511 2628 1555 4945 6108 3512 1946 3644 1520 2590 3011 3904 2289 1371 1915 1899 1290 2707 1150 1202 1716 7137 370 996 总和为11206 求详细过程 还有很多类似的要计算
展开
4个回答
展开全部
交给计算机吧,使用计算机程序来解决这类问题是一个好方法,毕竟现在计算机已经非常普及了。
下面使用C语言作一段处理代码:
#include<stdio.h>
#define DIGITMAX 26
#define Total 11206
int *start;
void getsum(int sum,int row,int *p)
{
int i,k,temp,*ptm;
if(sum>Total)return;
for(i=row;i<DIGITMAX;i++)
{
temp=sum+*(start+i);
if(temp==Total)
{
*p=*(start+i);
*(p+1)=-1;
printf("\n-----------\n");
for(ptm=start,k=0;k<20;k++,ptm++){
if(*ptm==-1)break;
printf("%d ",*ptm);
}
}
if(temp>Total)return;
*p=*(start+i);
getsum(temp,i+1,p+1);
}
}
main()
{
int num[26]={300,3000,3511,2628,1555,4945,6108,3512,1946,3644,1520,2590,3011,
3904,2289,1371,1915,1899,1290,2707,1150,1202,1716,7137,370, 996};
int *p,sum;
start=num,p=start,sum=0;
printf("1.=%d",*start);
getsum(sum,0,p);
return 0;
}这样的组合有不少,我试算了一下,其中有一组:996,1650,1915,2707,1150,1202,1716
下面使用C语言作一段处理代码:
#include<stdio.h>
#define DIGITMAX 26
#define Total 11206
int *start;
void getsum(int sum,int row,int *p)
{
int i,k,temp,*ptm;
if(sum>Total)return;
for(i=row;i<DIGITMAX;i++)
{
temp=sum+*(start+i);
if(temp==Total)
{
*p=*(start+i);
*(p+1)=-1;
printf("\n-----------\n");
for(ptm=start,k=0;k<20;k++,ptm++){
if(*ptm==-1)break;
printf("%d ",*ptm);
}
}
if(temp>Total)return;
*p=*(start+i);
getsum(temp,i+1,p+1);
}
}
main()
{
int num[26]={300,3000,3511,2628,1555,4945,6108,3512,1946,3644,1520,2590,3011,
3904,2289,1371,1915,1899,1290,2707,1150,1202,1716,7137,370, 996};
int *p,sum;
start=num,p=start,sum=0;
printf("1.=%d",*start);
getsum(sum,0,p);
return 0;
}这样的组合有不少,我试算了一下,其中有一组:996,1650,1915,2707,1150,1202,1716
展开全部
这个问题的实质是一个给出一个集合,求这个集合的所有组合的问题。(所有组合都出来了,就可以看哪个组合的和与期望值相同就行了。
可以参考下这个文章:
http://www.th7.cn/Program/cp/201301/120259.shtml
可以参考下这个文章:
http://www.th7.cn/Program/cp/201301/120259.shtml
更多追问追答
追问
文章看完了,还是没懂,我是小白
追答
就是可以考虑使用递归实现,下面是使用C的一个实现,运行后屏幕上输出的数字就是结果,对于这个问题来说,就是3511 2628 1555 3512这几个数字。
如果要做其他类似的计算,修改AllNumber和expected 的赋值就可以做其他不同的计算,
#include
int AllSum(int CurArray[], int len, int expected)
{
if (len >= 1)
{
if (CurArray[len - 1] == expected)
{
printf("%d ", CurArray[len - 1]);
return 1;
}
else
{
int result = AllSum(CurArray, len - 1, expected);
if (result)
return result;
else
{
if (CurArray[len - 1] < expected)
{
result = AllSum(CurArray, len - 1, expected - CurArray[len - 1]);
if (result)
{
printf("%d ", CurArray[len - 1]);
return 1;
}
}
return 0;
}
}
}
else
{
return 0;
}
}
void main()
{
int AllNumber[] = {300,3000,3511,2628,1555,4945,6108,3512,1946,3644,1520,2590,3011,3904,2289,1371,1915,1899,1290,2707,1150,1202,1716,7137,370,996};
int len = sizeof(AllNumber)/sizeof(int);
int expected = 11206;
AllSum(AllNumber, len, expected);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
正好26个数字,你编个程序(VB之类的就行),把这26个数字赋值给a~z的26个字母。然后做个循环,任意两项、3项、4项~26项相加等于11206的就保存,然后让计算机去跑吧。
追问
可是不会编啊,麻烦你编一个好嘛, 或者教我下怎么用EXCEL计算
追答
http://zhidao.baidu.com/question/354110360.html
经测试此过程能够达成你的目标
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用1029.96,349.91,430,650,660.05,540.09,1750,1135.03,7.81,1600,787.07,600,500,1399.93,640,7.19,123.74,169,734.96,495,29.82,690.07,684.99,625.01,779.98,710.05,560,29.75,610.06,18.74,19.21,19.05,22.17数字中找出哪几个数相加等于1946.34
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询