Created
October 7, 2014 14:20
-
-
Save yuikns/dc6e82a773ad50549015 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> // malloc | |
#include <string.h> // memset | |
#include <time.h> // shuffle | |
// dest : 被找出的数字存储的数组 | |
// src : 被shuffle并取走数字的数组 | |
// len : src数组的长度 | |
// return : dest有效内容长度 | |
int miss_num_finder(int * dest ,int * src , int len) | |
{ | |
int i; | |
int j = 0; | |
int * hs = (int *) malloc(sizeof(int) * 1000); // hash space | |
memset(hs,0,sizeof(int) * 1000); | |
memset(dest,0,sizeof(int) * (1000 - len)); | |
for(i = 0 ; i < len ; i ++) | |
{ | |
hs[src[i] - 1] = 1; | |
} | |
for(i = 0 ; i < 1000 ; i ++ ) | |
{ | |
if(hs[i] == 0 ) | |
{ | |
dest[j] = i + 1; | |
j ++ ; | |
} | |
} | |
free(hs); | |
return j; | |
} | |
#define decl_shuffle(type)\ | |
void shuffle_##type(type *list, size_t len) { \ | |
int j; \ | |
type tmp; \ | |
while(len) { \ | |
j = rand() % len; \ | |
if (j != len - 1) { \ | |
tmp = list[j]; \ | |
list[j] = list[len - 1]; \ | |
list[len - 1] = tmp; \ | |
} \ | |
len--; \ | |
} \ | |
} | |
/* declare and define int type shuffle function from macro */ | |
decl_shuffle(int); | |
int main() | |
{ | |
int i ; | |
int src[1000]; | |
int dest[1000]; | |
int rm_len; | |
int rm_off; | |
int rm_tmp; | |
int find_size; | |
srand((unsigned int) time(NULL)); | |
for(i = 0 ; i < 1000; i ++ ) | |
{ | |
src[i] = i + 1; | |
} | |
rm_len = rand() % 20 + 3; // number of to delete in range [3,22] | |
printf("try remove size : %d\n",rm_len); | |
for(i = 0 ; i < rm_len ; i ++ ) | |
{ | |
rm_off = rand() % (1000 - i - 1); | |
rm_tmp = src[rm_off]; | |
src[rm_off] = src[1000 - i - 1] ; | |
printf("[remove] : %d \n" , rm_tmp ); | |
} | |
shuffle_int(src,1000 - rm_len); | |
find_size = miss_num_finder(dest,src,1000 - rm_len); | |
printf ("found size : %d \n" , find_size); | |
for(i = 0 ; i < find_size ; i ++) | |
{ | |
printf("[found] : %d \n" , dest[i]); | |
} | |
return 0; | |
} | |
/* | |
//sample result | |
yu:test_code yu$ gcc miss_num_finder.c -o miss_num_finder | |
yu:test_code yu$ ./miss_num_finder | |
try remove size : 12 | |
[remove] : 30 | |
[remove] : 863 | |
[remove] : 293 | |
[remove] : 243 | |
[remove] : 830 | |
[remove] : 763 | |
[remove] : 445 | |
[remove] : 508 | |
[remove] : 125 | |
[remove] : 510 | |
[remove] : 222 | |
[remove] : 389 | |
found size : 12 | |
[found] : 30 | |
[found] : 125 | |
[found] : 222 | |
[found] : 243 | |
[found] : 293 | |
[found] : 389 | |
[found] : 445 | |
[found] : 508 | |
[found] : 510 | |
[found] : 763 | |
[found] : 830 | |
[found] : 863 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment