有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找
4个回答
展开全部
题目描述的不是很清晰啊,搜索算法是找出这个数还是找出这个重复数字的两个下标(位置)?
一,如果仅仅是找出这个数,那么可以这么做:
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就是两个下标
}
}
一,如果仅仅是找出这个数,那么可以这么做:
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就是两个下标
}
}
展开全部
手痒 试试以前只听说过的位存储 竟然鼓捣出来了 呵呵 方法是将这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;
}
#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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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次的数字
)
再设一个
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次的数字
)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1+。。。。+99 = 4950;
a[0] +....+a[99] -4950 = 要找的数
a[0] +....+a[99] -4950 = 要找的数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询