1个小时了,终于AC了。散列的最后一道B组题。
先说一下我这题的思路:利用hashTable来记录某个数出现的次数,最后遍历100以内的每个数,如果hashTable[i]==1 && 是读入的数据之一,则其为关键数。
坑点:
在对奇数进行处理的时候,可能会出现很大的数,导致数据出现段错误。
解决办法:把hashTable容量调大。
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
int hashTable[10005]; //数组容量调大
int str[105];
int main(){
int k;
scanf("%d",&k);
//对读入的每个数据进行操作
for(int i=0;i<k;i++){
scanf("%d",&str[i]);
hashTable[str[i]]++;
int p=str[i];
while(p!=1){
if(p%2==1){
p=(3*p+1)/2;
hashTable[p]++;
}
else{
p/=2;
hashTable[p]++;
}
}
}
int count=0;//用来输出空格
for(int j=100;j>=0;j--){//遍历100个数
int temp=0;
for(int i=0;i<k;i++){//看100以内的数是不是读入的数据
if(str[i]==j){
temp=1;
break;
}
}
if(hashTable[j]==1&&temp==1){//是读入的数据且只出现一次,便可输出结果
if(count!=0)
printf(" ");
printf("%d",j);
count++;
}
}
return 0;
}