有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找

 我来答
吧遥人D
2010-10-12 · TA获得超过200个赞
知道答主
回答量:53
采纳率:0%
帮助的人:79.5万
展开全部
题目描述的不是很清晰啊,搜索算法是找出这个数还是找出这个重复数字的两个下标(位置)?
一,如果仅仅是找出这个数,那么可以这么做:
int baseSum = (1+99)/2*99; //1+2+...99
int sum = 0;
int i;
for(i=0; i<100; i++)
{
sum += a[i];
}
//sum-baseSum即是要搜索的数字
二,如果需要找出重复数字的下标,可以以空间换取时间的代价:
int b[100]; //b[i] = x,表示a[x] = i
memset(b, sizeof(int)*100, -1);
int i;
for(i=0; i<100; i++)
{
if(-1 == b[a[i]])
{
b[a[i]] = i;
}
else
{
//说明a[i]这个数曾经出现过,那么a[i]就是重复的数字,
//之前保存的下标b[a[i]]和当前的i就是两个下标
}
}
sb55154634
2010-10-12 · TA获得超过150个赞
知道小有建树答主
回答量:172
采纳率:100%
帮助的人:160万
展开全部
手痒 试试以前只听说过的位存储 竟然鼓捣出来了 呵呵 方法是将这100个数分配到每一个位,1个int是32个位 那么4个int数就能存储这100个数是否存在的情况
#include <iostream>
using namespace std;

int setNum(unsigned int*, int);

void main() {
unsigned int m[4] = {0, 0, 0, 0};
int num, n;
int a[100];

for(int i=0; i<100; i++) {
a[i] = i;
}

a[65] = 34;

for(int i=0; i<100; i++) {
if(!setNum(m, a[i])) {
cout<<"重复数为:"<<a[i]<<endl;
break;
}
}

n=3;
}

int setNum(unsigned int* m, int n) {
int position = m[n/32]; //获取存储该数的int值
int i = n%32; //定位存储该数的int数的第几个bit

int j = position << (31 - i) >> 31; //先将存储该数的bit位左移至最后一位, 再移至第一位,即获取该bit位的值,这时其他位都已为0,1即此数已存在,0则不存在
if(j) return 0; //若该位为1 则该数已存在 返回0
m[n/32] = m[n/32] | (1 << i); //1 << i为只在指定bit位为1 其他为0

return 1;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
邵钱伟
2010-10-12 · TA获得超过217个赞
知道小有建树答主
回答量:250
采纳率:0%
帮助的人:182万
展开全部
a[100]是存放你的数字
再设一个
b[100]=0计数器统一赋值为0
for(i=0,i<100,i++)
(b[a[i]]++
)
for(i=0,i<100,i++)
(if b[i]=2
输出 i --->i就是那个出现过2次的数字
)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
元初晴014
2010-10-14 · TA获得超过2174个赞
知道小有建树答主
回答量:589
采纳率:0%
帮助的人:611万
展开全部
1+。。。。+99 = 4950;

a[0] +....+a[99] -4950 = 要找的数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式