7-60 致命的珠宝 (10分)

7-60 致命的珠宝 (10分)
 

Mini使用神风无影来到了大魔王所居住的洞穴,门口却有着险恶的机关。门上有着N个宝珠,每个宝珠都有一个数字。传说,只要宝珠里的两颗珠撞在一起后就会发出奇异的光彩,但发出的光彩有可能是致命的,也有可能是打开前进之路的钥匙。Mini询问老者后,得知要想打开这扇门,就得找出两颗珠宝,使这两颗珠宝撞在一起后产生的能量值最接近16。

两颗珠宝撞在一起以后产生的能量值的计算方法是:将两个珠宝所代表的数字转换为7进制的数后,一一对照这两个七进制数的每一位,若相同,则结果为0否则为1。

如:两颗珠子所代表的数为18和370,将这两个数转化为7进制后是24和1036,对于高位不足的数,采取高位添‘0’的方法,即两个数为0024,1036。最后得到的能量值C为1011,再将C当作二进制数转换为十进制数。那么转换后的C就为这两个珠撞在一起以后所产生的能量值。

输入格式:

第一行一个数N,表示宝珠的数量(2<=N<=1200)。 第二行N个数,每个数用空格隔开,每个数表示第I个宝珠所代表的数字(0<=每个数<=11111)。

输出格式:

一个数,代表你所找到的最接近16的能量值。

输入样例:

5
18 370 45 36 78
 

输出样例:

15


#include<stdio.h>
#include<math.h>
int f(int x,int y)
{
    int a[5]={0};
    int b[5]={0};
    int count_a=0, count_b=0;
    while(x)
    {
     a[count_a++]=x%7;
     x/=7;
     
 }
 while(y)
 {
  b[count_b++]=y%7;
  y/=7;
  
 }
 count_a=count_a>count_b?count_a:count_b;
 int i;
 for(i=0;i<count_a;i++)
 {
  a[i]=a[i]^b[i];
 }
 int sum=0;
 for(i=count_a-1;i>=0;i--)
 {
  sum=sum*2+a[i];
  
 }
 return sum;
 
}
int main()
{
 int n;
 scanf("%d",&n);
 int a[n];
 int i;
 for(i=0;i<n;i++)
 {
  scanf("%d",a+i);
 }
 int max=0;
 int j;
 int temp;
 for(i=0;i<n;i++)
 {
  for(j=i+1;j<n;j++)
  {
   temp=f(a[i],a[j]);
   if(fabs(max-16)>fabs(temp-16))
   max=temp;
   
  }
 }
 printf("%d\n",max);
 return 0;
}

posted @ 2020-10-21 16:37  罪梦者  阅读(238)  评论(0)    收藏  举报