题解 | #明明的随机数#
明明的随机数
https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0
#include <stdio.h>
#include <string.h>
/*
描述
明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
数据范围: 1≤n≤1000,输入的数字大小满足1≤val≤500
输入描述:
第一行先输入随机整数的个数N。 接下来的N行每行输入一个整数,代表明明生成的随机数。具体格式可以参考下面的"示例"。
输出描述:
输出多行,表示输入数据处理后的结果
*/
/*
解题思路:
1,数字范围1≤val≤500,加之去重,考虑用512bits(32*16)构建桶排序
2,每输入一个就可以处理一个
*/
#define bitsizeof(bits) ((int)(sizeof(bits)*8))
int bits[16];
int getbitvalue(int* bitsbase, int bitssize, int bitindex) {
int ret = -1, int32pos = 0, bit32 = 0;
if (bitindex < bitssize) {
int32pos = bitindex / bitsizeof(bitsbase[0]);
bit32 = bitindex % bitsizeof(bitsbase[0]);
ret = 1 & (bitsbase[int32pos] >> bit32);
}
return ret;
}
int setbitvalue(int* bitsbase, int bitssize, int bitindex, int bitvalue) {
int ret = 0, int32pos = 0, bit32 = 0;
if (bitindex < bitssize) {
int32pos = bitindex / bitsizeof(bitsbase[0]);
bit32 = bitindex % bitsizeof(bitsbase[0]);
if (bitvalue == 1) {
bitsbase[int32pos] |= 1 << bit32;
ret = 1;
} else if (bitvalue == 0) {
bitsbase[int32pos] &= ~(1 << bit32);
ret = 1;
}
}
return ret;
}
int main() {
int n = 0, val = 0, i = 0, size = 0;
size = bitsizeof(bits);
memset(bits, 0, sizeof(bits));
if (scanf("%d", &n) != EOF) {
i = 0;
while (i < n) {
if (scanf("%d", &val) != EOF) {
if (getbitvalue(bits, size, val) == 0) {
setbitvalue(bits, size, val, 1);
}
i++;
}
}
i = 0;
while (i < size) {
if (getbitvalue(bits, size, i) == 1) {
printf("%d\n", i);
}
i++;
}
}
return 0;
}
