判断一个数组中是否存在某个数

depad 2010-10-31 09:09:45
有一数组a[6]={1,2,3,4,5,6}
比如 4=4 则数组存在 4
比如 7=1+6 则数组中存在7
比如 15=1+2+3+4+5 则数组中存在15
比如 22 数组中所有元素之和为21 则数组中不存在22
上面的数组只是打个比方
用c怎么写。。。。

...全文
1786 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
laoshizhuce 2010-11-01
  • 打赏
  • 举报
回复
感觉题目不错
先MARK一下
lyingbo 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tianweishuiguo 的回复:]
用树实现或者用堆
[/Quote]

+1

觉得这个想法比较好,比较的时候容易些
maoenhui 2010-11-01
  • 打赏
  • 举报
回复
先排序,剔除比这个数大的数字。之后,怎么加,我也不知道
赵4老师 2010-11-01
  • 打赏
  • 举报
回复
参考一下
//n个(2<=n<=20)整数(整数范围-10<=x<=10),判断是否可以从这n个数中找到若干个数,其和为10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
int MAXN=20;
int MINN=2;
int x[20];
int n,i,j,k,sum;
int main() {
srand((unsigned)time(NULL));
n=MINN+rand()%(MAXN-1);
for (i=0;i<n;i++) {
x[i]=-10+rand()%21;
printf("%d,",x[i]);
}
printf("\n");
sort(&x[0],&x[n]);
do {
for (i=2;i<=n;i++) {
sum=0;
k=n/2-i/2;
for (j=k;j<k+i;j++) {
sum+=x[j];
}
if (10==sum) {
for (j=k;j<k+i;j++) {
if (j==k+i-1) {
printf("%d==10\n",x[j]);
} else {
printf("%d+",x[j]);
}
}
printf("YES\n");
return 1;
}
}
} while (next_permutation(&x[0],&x[n]));
printf("NO\n");
return 0;
}
  • 打赏
  • 举报
回复
如果数组里的数字是没有规律的,那不用费心了。
先预处理一编,把所有组合的结果都算出来。存在位图里,以后再去查。
screwzm 2010-11-01
  • 打赏
  • 举报
回复
数字允许重复使用不?
说明规则啊!!!
changmao4 2010-11-01
  • 打赏
  • 举报
回复
虽然没试过,,不过先顶楼上的
时代变迁 2010-11-01
  • 打赏
  • 举报
回复
看看这个吧

#include <stdio.h>
#include <stdlib.h>

int n=6, input;
int num[n] = {1, 2, 3, 4, 5, 6};

int find(int flag)
{
int sum,s;
for(int i=0;i<n;i++){
sum=0;
s=0;
for(int k=i;k<n;k++{
s+=num[k];
if(flag==sum) return 1;
for(int j=k+1;j<n;j++){
sum=s+num[j];
if(flag==sum) return 1;
}
}
}
return 0;
}

int main()
{
scanf("%d", &input);
if(find(input)){
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}


zecard_fu 2010-11-01
  • 打赏
  • 举报
回复
代码还可以优化! 比如1+5 的时候 其实和 一个6 情况一样! 但鉴于代码好理解的情况下! 还是不做优化了!
zecard_fu 2010-11-01
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

int n=6, m, input;
int rcd[6], num[6] = {1, 2, 3, 4, 5, 6};

int find(int l, int p)
{
int i, sum;
if (l == m) {
for (i=0, sum=0; i<m; i++) sum += rcd[i];
if (sum == input) puts("yes"), exit(0);
return 0;
}
for (i=p; i<=n-(m-l); i++) {
rcd[l] = num[i];
find(l+1, i+1);
}
}

int main()
{
scanf("%d", &input);
for (m=1; m<=6; m++) find(0, 0);
}

输入21 打印 yes; 输入22 不打印!
adooadoo 2010-10-31
  • 打赏
  • 举报
回复
楼主,我也想不到好办法,顶多优化一下,既创建数组的同时便创建一颗最小生成树,再把相加所有情况都插入树中,这样查找会快点而且可以多次使用,缺点是空间浪费和效率太低…求大侠…
hotjim 2010-10-31
  • 打赏
  • 举报
回复
感觉是不是能把数组用队列结构,然后将要验证的数S,看看在队列那一部分,后将用不到的数(即大于它的数)排除,然后再根据S的奇偶性来判断,可能这样会效率高点儿把、。。。
hotjim 2010-10-31
  • 打赏
  • 举报
回复
不知道……只能想到一个个式
depad 2010-10-31
  • 打赏
  • 举报
回复
能说具体点吗?
现在是完全找不到头绪。
想到的算法效率太低了
东大坡居士 2010-10-31
  • 打赏
  • 举报
回复
用树实现或者用堆

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧