主题:第66次编程比赛
雨中飞燕 [专家分:18980] 发布于 2008-05-22 23:02:00
[size=3]问题题目:最大的异或
[color=0000FF]题目描述:[/color]
给你n个正整数,你要找出哪两个数按位异或运算后的结果是最大的
[color=0000FF]输入:[/color]
输入一个整数n(2<=n<=100000),然后就是n个1e9以内的正整数
[color=0000FF]输出:[/color]
输出最大的按位异或运算结果
[color=0000FF]样例输入:[/color]
4
1 3 4 7
[color=0000FF]样例输出:[/color]
7
[color=0000FF]提示:[/color]
3和4的异或的结果是7,已经最大
参加比赛者直接回复本帖子即可,回复帖子不可见
结束时间:6月2日[/size]
最后更新于:2008-05-27 09:59:00
回复列表 (共27个回复)
11 楼
lyqiang [专家分:0] 发布于 2008-05-27 16:59:00
内容隐藏,本帖结帖后才能浏览。
12 楼
lyqiang [专家分:0] 发布于 2008-05-27 16:59:00
内容隐藏,本帖结帖后才能浏览。
13 楼
goal00001111 [专家分:4030] 发布于 2008-05-27 19:26:00
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
int MaxXOR(int Data[], int len);
int main()
{
int Data[4] = {1, 3, 4, 7};
int max = MaxXOR(Data, 4);
cout << max << endl;
getchar();
return 0;
}
int MaxXOR(int Data[], int len)
{
int max = 0;
int result;
for (int i=0; i<len-1; i++)
{
for (int j=i+1; j<len; j++)
{
result = Data[i] ^ Data[j];
if (max < result)
{
max = result;
}
}
}
return max;
}
14 楼
markman [专家分:20] 发布于 2008-05-27 21:59:00
#include <iostream>
#include <conio.h>
#include <vector>
#include <fstream>
using namespace std;
void main()
{
vector <int> Xor;
vector <int>::iterator it,is;
int a;
int i=0;
int c;
int max=0;
int d;
cout<<"请输入要进行最大的异或比较的数值的个数"<<endl;
cin>>a;
cout<<"请输入要进行最大异或比较的数值"<<endl;
while(i<a)
{
cin>>c;
while(cin.fail())
{
cout<<"你输入了不正确的数值"<<endl;
cin.clear();
cin.sync();
cin>>c;
}
if(c<1e9&&c>0)
{
Xor.push_back(c);
++i;
}
else
continue;
}
it= Xor.begin();
for(;it!=Xor.end();++it)
{
for(is=it+1;is!=Xor.end();++is)
{
d=*it^*is;
if(max<d)
max=d;
}
}
cout<<"已经找到了最大异或值"<<endl;
cout<<max;
getch();
}
15 楼
笪笪250 [专家分:0] 发布于 2008-05-27 23:47:00
的
16 楼
adameya [专家分:0] 发布于 2008-05-28 20:15:00
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*变量定义*/
int n=0; /*定义参与运算的变量的个数*/
int *p=NULL; /*定义指向存储参与运算数据区域的指针*/
int xor_result=0; /*定义每次异或运算结果存放变量*/
int max=0; /*定义当前异或运算结果最大值存放变量*/
int i=0,j=0; /*定义循环变量*/
printf("Please enter the number of the datas:\n");
scanf("%d",&n); /*输入参与运算的变量的个数*/
p=(int *)(calloc((unsigned)(n),sizeof(int))); /*为参与运算的变量分配存储空间*/
printf("Please enter %d integer datas to calculate,\n",n);
printf("press ENTER after you enter a data.\n");
for(i=0;i<n;i++) /*参与运算的变量的输入*/
scanf("%d",p+i);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
xor_result=p[i]^p[j]; /*对每个数据与它之后的每个数据进行按位异或运算,每次运算结果存入xor_result*/
if(xor_result>max) /*若按位异或运算结果大于当前异或结果最大值,则该运算结果存入max变量*/
max=xor_result; /*继续向下运算,只道每个数据均与其他数据进行过异或运算为止*/
}
printf("the max xor_result is %d.\n",max); /*输出异或运算结果最大值*/
free((void *)(p)); /*释放存储空间*/
return 0; /*返回操作系统*/
}
17 楼
csw2008002 [专家分:0] 发布于 2008-05-30 10:16:00
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
main()
{
int num,k,i,j,m[20],x,y,max=0;
printf("input the num:\n");
scanf("%d",&num);
for(k=0;k<num;k++)
{
printf("please input the %d number:\n",k);
scanf("%d",&m[k]);
}
for(i=0;i<num-1;i++)
{
for(j=i+1;j<num;j++)
{
k=m[i]^m[j];
if(k>max)
{
max=k;
x=i;
y=j;
}
}
}
printf("it is %d^%d=%d",m[x],m[y],max);
getch();
}
18 楼
Guass [专家分:0] 发布于 2008-05-30 10:37:00
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <stdlib.h>
const long N = 3500000;
long n,ans;
long next[N][2],data[N],tot;
bool isok[N];
long a[N];
long tmp[35];
void Check(long nn)
{
long tp=nn,i=0,j,k;
memset(tmp,0,sizeof(tmp));
while(tp)
{
tmp[i]=tp&1;
tp>>=1;
i++;
}
// for(i=0;i<34;i++)printf("%ld",tmp[i]);printf("\n");
i=0,j=34;
while(!isok[i])
{
// printf("%ld %ld %ld J-Next\n",tmp[j],next[i][0],next[i][1]);
if(tmp[j]==0)
{
if(next[i][1])i=next[i][1];
else i=next[i][0];
}
else
{
if(next[i][0])i=next[i][0];
else i=next[i][1];
}
j--;
}
// printf("%ld - %ld N\n",data[i],nn);
if((data[i]^nn)>ans)ans=(data[i]^nn);
//printf("%ld\n",ans);
}
inline void Insert(long nn)
{
long tp=nn,i=0,j,k;
memset(tmp,0,sizeof(tmp));
while(tp)
{
tmp[i]=tp&1;
tp>>=1;
i++;
}
// for(i=0;i<34;i++)printf("%ld",tmp[i]);printf("\n");
i=0,j=34;
for(;next[i][tmp[j]]&&!(isok[next[i][tmp[j]]])&&j;)
{
i=next[i][tmp[j]];j--;
}
if(isok[next[i][tmp[j]]])return;
for(;j>=0;j--)
{
next[i][tmp[j]]=++tot;
i=tot;
}
isok[i]=1;
data[i]=nn;
}
int main()
{
long i,j,k,t1,t2,tans;
while(scanf("%ld",&n)!=EOF)
{
tot=0;
memset(isok,0,sizeof(isok));
memset(next,0,sizeof(next));
tans = ans = 0;
for(i=0;i<n;i++)
{
scanf("%ld",&t1);
// t2=rand()%30000;
// t1=rand()%30000;
// t1*=t2;
// a[i]=t1;
// printf("%ld\n",t1);
// for(j=0;j<i;j++)
// {
// printf("%ld - %ld : %ld\n",i,j,a[j]^a[i]);
// if((a[j]^a[i])>tans)tans = (a[j]^a[i]);
// }
if(i)Check(t1);
Insert(t1);
// printf("t%ld\n",ans);
// printf("t%ld\n",tans);
}
printf("%ld\n",ans);
//printf("%ld\n",tans);
}
return 0;
}
19 楼
蓝桥小帽 [专家分:0] 发布于 2008-05-30 12:47:00
#include <iostream>
#include <stdio.h>
using namespace std;
long a[100000];
int main()
{
long n,x1,x2,result;
int i,j;
cin>>n;
while(!(n<2 || n>100000))
{ x1=x2=result=i=0;
while(i<n)cin>>a[i++];
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if((a[i] | a[j])>result)
{
result=a[i] | a[j];
x1=a[i];
x2=a[j];
}
}
cout<<result<<endl;
cin>>n;
}
return 0;
}
我来回复