如果一个文件内存储了10亿个商品的销量数据,请你编程在其中找出前1000大的数据。
主要思路就是利用一个小顶堆,先填满1000个元素,此后的元素加入时,先与
top
比较,若比top
大,则用它代替top
,并重新使其符合小顶堆。代码如下。
#include <stdio.h>
#define FILEDIR argv[1]
unsigned int data[1024]; //a min top heap
int last = 0; //the last element position
#define swap(a, b){\ int c = b;\ b = a;\ a = c;\ }
#define add(num, pos){\ data[pos] = num;\ for(int i = last; i > 0; i /= 2)\ if(data[i / 2] > data[i]) swap(data[i], data[i / 2])\ }
#define cover(num){\ data[1001] = num;\ data[0] = num;\ for(int i = 1; i <= 1000; i *= 2){\ if(data[i / 2] > data[i]){\ if(data[i] <= data[i + 1]) swap(data[i], data[i / 2])\ else{\ swap(data[i + 1], data[i / 2])\ i++;\ }\ }else if(data[i / 2] > data[i + 1]){\ swap(data[i + 1], data[i / 2])\ i++;\ }\ }\ }
int main(int argc, char **argv){
FILE *fp = NULL;
int num;
fp = fopen(FILEDIR, "r");
if(!fp){
fputs("Read file error.", stderr);
return 1;
}
while(~fscanf(fp, "%u", &num)){
//printf("read:%d\n", num);
if(last <= 1000) add(num, last++)
else if(num > data[0]) cover(num)
}
fclose(fp);
for(int i = 1; i <= 1000; i++) printf("%u ", data[i]);
return 0;
}
接下来测试程序功能。
先生成一个0~99999的有序数列文件进行测试。
#include <stdio.h>
#include <stdlib.h>
#define FILEDIR argv[1]
int main(int argc, char **argv){
FILE *fp = NULL;
fp = fopen(FILEDIR, "w");
if(!fp){
fputs("Read file error.", stderr);
return 1;
}
for(int i = 0; i < 1e5; i++) fprintf(fp, "%d ", i);
fclose(fp);
return 0;
}
输出结果如下。
99000 99001 99158 99059 99002 99159 99187 99088 99060 99003 99024 99343 99160 99215 99188 99115 99089 99061 99083 99004 99019 99051
99025 99370 99344 99179 99161 99242 99216 99283 99189 99116 99123 99090 99092 99075 99062 99084 99155 99011 99005 99020 99475 99052
99443 99026 99029 99371 99378 99345 99347 99180 99315 99173 99162 99243 99251 99217 99220 99284 99292 99197 99190 99117 99118 99127
99124 99111 99091 99095 99093 99079 99076 99063 99071 99085 99151 99413 99156 99015 99012 99006 99007 99021 99471 99478 99476 99053
99056 99446 99444 99048 99027 99034 99030 99372 99373 99382 99379 99366 99346 99350 99348 99181 99184 99318 99316 99176 99174 99163
99169 99244 99247 99254 99252 99239 99218 99225 99221 99285 99288 99295 99293 99198 99203 99193 99191 99141 99144 99119 99121 99128
99130 99126 99125 99112 99114 99110 99107 99096 99099 99104 99094 99080 99082 99078 99077 99064 99067 99072 99441 99087 99086 99152
99425 99414 99417 99422 99157 99016 99018 99014 99013 99510 99513 99008 99506 99023 99022 99472 99490 99479 99482 99487 99477 99055
99054 99057 99458 99447 99450 99455 99445 99049 99467 99028 99045 99035 99038 99041 99031 99396 99399 99374 99376 99383 99385 99381
99380 99367 99369 99365 99362 99351 99354 99359 99349 99183 99182 99185 99330 99319 99322 99327 99317 99177 99339 99407 99175 99164
99166 99170 99410 99246 99245 99248 99266 99255 99258 99263 99253 99240 99275 99219 99236 99226 99229 99232 99222 99287 99286 99289
99307 99296 99299 99304 99294 99202 99199 99205 99204 99194 99700 99192 99196 99142 99143 99145 99623 99627 99120 99122 99140 99634
99129 99131 99133 99134 99136 99138 99137 99619 99113 99146 99148 99149 99597 99109 99108 99098 99097 99101 99100 99106 99105 99103
99600 99588 99081 99433 99435 99436 99438 99440 99439 99066 99065 99069 99068 99074 99073 99571 99570 99429 99431 99592 99432 99154
99153 99427 99426 99416 99415 99419 99418 99424 99423 99421 99664 99525 99017 99498 99500 99501 99503 99505 99504 99511 99512 99514
99516 99010 99009 99508 99507 99494 99496 99529 99497 99474 99473 99492 99491 99481 99480 99484 99483 99489 99488 99486 99960 99462
99464 99561 99465 99442 99058 99460 99459 99449 99448 99452 99451 99457 99456 99454 99569 99466 99050 99469 99468 99537 99535 99047
99046 99036 99542 99040 99039 99043 99042 99538 99032 99397 99398 99400 99856 99860 99375 99377 99395 99867 99384 99386 99388 99389
99391 99393 99392 99852 99368 99401 99403 99404 99830 99364 99363 99353 99352 99356 99355 99361 99360 99358 99833 99334 99336 99689
99337 99314 99186 99332 99331 99321 99320 99324 99323 99329 99328 99326 99697 99338 99178 99341 99340 99409 99408 99406 99681 99165
99670 99168 99167 99171 99678 99412 99411 99270 99272 99731 99273 99250 99249 99268 99267 99257 99256 99260 99259 99265 99264 99262
99739 99274 99241 99277 99276 99707 99705 99238 99237 99227 99712 99231 99230 99234 99233 99708 99223 99311 99313 99771 99698 99291
99290 99309 99308 99298 99297 99301 99300 99306 99305 99303 99779 99211 99210 99212 99200 99209 99208 99206 99207 99702 99195 99703
99701 99282 99699 99767 99802 99625 99624 99650 99649 99652 99651 99654 99653 99648 99647 99628 99626 99630 99139 99646 99629 99640
99639 99635 99633 99637 99132 99638 99636 99642 99135 99643 99641 99645 99631 99632 99644 99657 99656 99620 99618 99622 99147 99655
99621 99659 99150 99660 99658 99599 99616 99617 99598 99604 99605 99606 99102 99608 99609 99610 99607 99611 99612 99613 99603 99615
99602 99601 99614 99922 99921 99589 99587 99591 99434 99920 99590 99924 99437 99925 99923 99927 99585 99586 99926 99573 99574 99575
99070 99577 99578 99579 99576 99580 99581 99582 99572 99584 99928 99929 99583 99916 99430 99917 99915 99919 99593 99594 99918 99595
99596 99661 99428 99663 99913 99914 99662 99668 99902 99903 99420 99905 99906 99907 99904 99908 99909 99910 99667 99912 99666 99665
99911 99985 99984 99526 99524 99528 99499 99983 99527 99987 99502 99988 99986 99990 99522 99523 99989 99994 99999 99995 99993 99997
99515 99998 99996 99517 99518 99519 99509 99521 99991 99992 99520 99979 99495 99980 99978 99982 99530 99531 99981 99532 99533 99957
99493 99959 99976 99977 99958 99964 99965 99966 99485 99968 99969 99970 99967 99971 99972 99973 99963 99975 99962 99961 99974 99948
99463 99949 99947 99951 99562 99563 99950 99564 99565 99566 99461 99568 99945 99946 99567 99933 99934 99935 99453 99937 99938 99939
99936 99940 99941 99942 99932 99944 99931 99930 99943 99557 99558 99559 99470 99952 99953 99954 99560 99955 99956 99536 99556 99534
99555 99554 99553 99037 99544 99543 99548 99541 99547 99546 99545 99044 99552 99551 99550 99549 99540 99539 99033 99858 99857 99883
99882 99885 99884 99887 99886 99881 99880 99861 99859 99863 99394 99879 99862 99873 99872 99868 99866 99870 99387 99871 99869 99875
99390 99876 99874 99878 99864 99865 99877 99890 99889 99853 99851 99855 99402 99888 99854 99892 99405 99893 99891 99832 99849 99850
99831 99837 99838 99839 99357 99841 99842 99843 99840 99844 99845 99846 99836 99848 99835 99834 99847 99821 99335 99822 99820 99824
99690 99691 99823 99692 99693 99694 99333 99696 99818 99819 99695 99806 99807 99808 99325 99810 99811 99812 99809 99813 99814 99815
99805 99817 99804 99803 99816 99685 99686 99687 99342 99825 99826 99827 99688 99828 99829 99894 99684 99896 99683 99682 99895 99901
99672 99671 99676 99669 99675 99674 99673 99172 99680 99679 99900 99677 99899 99898 99897 99758 99271 99759 99757 99761 99732 99733
99760 99734 99735 99736 99269 99738 99755 99756 99737 99743 99744 99745 99261 99747 99748 99749 99746 99750 99751 99752 99742 99754
99741 99740 99753 99727 99728 99729 99278 99762 99763 99764 99730 99765 99766 99706 99726 99704 99725 99724 99723 99228 99714 99713
99718 99711 99717 99716 99715 99235 99722 99721 99720 99719 99710 99709 99224 99798 99312 99799 99797 99801 99772 99773 99800 99774
99775 99776 99310 99778 99795 99796 99777 99783 99784 99785 99302 99787 99788 99789 99786 99790 99791 99792 99782 99794 99781 99780
99793 99769 99279 99280 99281 99214 99770 99201 99213 99768
由于数据为乱序,故编写检测程序如下。
#include <stdio.h>
#include <stdbool.h>
#define FILEDIR argv[1]
bool hash[100000];
int main(int argc, char **argv){
FILE *fp = NULL;
int num;
fp = fopen(FILEDIR, "r");
if(!fp){
fputs("Read file error.", stderr);
return 1;
}
while(~fscanf(fp, "%d", &num)) hash[num] = true;
for(num = 0; num < 1e5; num++) if(hash[num]) printf("%d ", num);
fclose(fp);
return 0;
}
输出结果如下。
99000 99001 99002 99003 99004 99005 99006 99007 99008 99009 99010 99011 99012 99013 99014 99015 99016 99017 99018 99019 99020 99021
99022 99023 99024 99025 99026 99027 99028 99029 99030 99031 99032 99033 99034 99035 99036 99037 99038 99039 99040 99041 99042 99043
99044 99045 99046 99047 99048 99049 99050 99051 99052 99053 99054 99055 99056 99057 99058 99059 99060 99061 99062 99063 99064 99065
99066 99067 99068 99069 99070 99071 99072 99073 99074 99075 99076 99077 99078 99079 99080 99081 99082 99083 99084 99085 99086 99087
99088 99089 99090 99091 99092 99093 99094 99095 99096 99097 99098 99099 99100 99101 99102 99103 99104 99105 99106 99107 99108 99109
99110 99111 99112 99113 99114 99115 99116 99117 99118 99119 99120 99121 99122 99123 99124 99125 99126 99127 99128 99129 99130 99131
99132 99133 99134 99135 99136 99137 99138 99139 99140 99141 99142 99143 99144 99145 99146 99147 99148 99149 99150 99151 99152 99153
99154 99155 99156 99157 99158 99159 99160 99161 99162 99163 99164 99165 99166 99167 99168 99169 99170 99171 99172 99173 99174 99175
99176 99177 99178 99179 99180 99181 99182 99183 99184 99185 99186 99187 99188 99189 99190 99191 99192 99193 99194 99195 99196 99197
99198 99199 99200 99201 99202 99203 99204 99205 99206 99207 99208 99209 99210 99211 99212 99213 99214 99215 99216 99217 99218 99219
99220 99221 99222 99223 99224 99225 99226 99227 99228 99229 99230 99231 99232 99233 99234 99235 99236 99237 99238 99239 99240 99241
99242 99243 99244 99245 99246 99247 99248 99249 99250 99251 99252 99253 99254 99255 99256 99257 99258 99259 99260 99261 99262 99263
99264 99265 99266 99267 99268 99269 99270 99271 99272 99273 99274 99275 99276 99277 99278 99279 99280 99281 99282 99283 99284 99285
99286 99287 99288 99289 99290 99291 99292 99293 99294 99295 99296 99297 99298 99299 99300 99301 99302 99303 99304 99305 99306 99307
99308 99309 99310 99311 99312 99313 99314 99315 99316 99317 99318 99319 99320 99321 99322 99323 99324 99325 99326 99327 99328 99329
99330 99331 99332 99333 99334 99335 99336 99337 99338 99339 99340 99341 99342 99343 99344 99345 99346 99347 99348 99349 99350 99351
99352 99353 99354 99355 99356 99357 99358 99359 99360 99361 99362 99363 99364 99365 99366 99367 99368 99369 99370 99371 99372 99373
99374 99375 99376 99377 99378 99379 99380 99381 99382 99383 99384 99385 99386 99387 99388 99389 99390 99391 99392 99393 99394 99395
99396 99397 99398 99399 99400 99401 99402 99403 99404 99405 99406 99407 99408 99409 99410 99411 99412 99413 99414 99415 99416 99417
99418 99419 99420 99421 99422 99423 99424 99425 99426 99427 99428 99429 99430 99431 99432 99433 99434 99435 99436 99437 99438 99439
99440 99441 99442 99443 99444 99445 99446 99447 99448 99449 99450 99451 99452 99453 99454 99455 99456 99457 99458 99459 99460 99461
99462 99463 99464 99465 99466 99467 99468 99469 99470 99471 99472 99473 99474 99475 99476 99477 99478 99479 99480 99481 99482 99483
99484 99485 99486 99487 99488 99489 99490 99491 99492 99493 99494 99495 99496 99497 99498 99499 99500 99501 99502 99503 99504 99505
99506 99507 99508 99509 99510 99511 99512 99513 99514 99515 99516 99517 99518 99519 99520 99521 99522 99523 99524 99525 99526 99527
99528 99529 99530 99531 99532 99533 99534 99535 99536 99537 99538 99539 99540 99541 99542 99543 99544 99545 99546 99547 99548 99549
99550 99551 99552 99553 99554 99555 99556 99557 99558 99559 99560 99561 99562 99563 99564 99565 99566 99567 99568 99569 99570 99571
99572 99573 99574 99575 99576 99577 99578 99579 99580 99581 99582 99583 99584 99585 99586 99587 99588 99589 99590 99591 99592 99593
99594 99595 99596 99597 99598 99599 99600 99601 99602 99603 99604 99605 99606 99607 99608 99609 99610 99611 99612 99613 99614 99615
99616 99617 99618 99619 99620 99621 99622 99623 99624 99625 99626 99627 99628 99629 99630 99631 99632 99633 99634 99635 99636 99637
99638 99639 99640 99641 99642 99643 99644 99645 99646 99647 99648 99649 99650 99651 99652 99653 99654 99655 99656 99657 99658 99659
99660 99661 99662 99663 99664 99665 99666 99667 99668 99669 99670 99671 99672 99673 99674 99675 99676 99677 99678 99679 99680 99681
99682 99683 99684 99685 99686 99687 99688 99689 99690 99691 99692 99693 99694 99695 99696 99697 99698 99699 99700 99701 99702 99703
99704 99705 99706 99707 99708 99709 99710 99711 99712 99713 99714 99715 99716 99717 99718 99719 99720 99721 99722 99723 99724 99725
99726 99727 99728 99729 99730 99731 99732 99733 99734 99735 99736 99737 99738 99739 99740 99741 99742 99743 99744 99745 99746 99747
99748 99749 99750 99751 99752 99753 99754 99755 99756 99757 99758 99759 99760 99761 99762 99763 99764 99765 99766 99767 99768 99769
99770 99771 99772 99773 99774 99775 99776 99777 99778 99779 99780 99781 99782 99783 99784 99785 99786 99787 99788 99789 99790 99791
99792 99793 99794 99795 99796 99797 99798 99799 99800 99801 99802 99803 99804 99805 99806 99807 99808 99809 99810 99811 99812 99813
99814 99815 99816 99817 99818 99819 99820 99821 99822 99823 99824 99825 99826 99827 99828 99829 99830 99831 99832 99833 99834 99835
99836 99837 99838 99839 99840 99841 99842 99843 99844 99845 99846 99847 99848 99849 99850 99851 99852 99853 99854 99855 99856 99857
99858 99859 99860 99861 99862 99863 99864 99865 99866 99867 99868 99869 99870 99871 99872 99873 99874 99875 99876 99877 99878 99879
99880 99881 99882 99883 99884 99885 99886 99887 99888 99889 99890 99891 99892 99893 99894 99895 99896 99897 99898 99899 99900 99901
99902 99903 99904 99905 99906 99907 99908 99909 99910 99911 99912 99913 99914 99915 99916 99917 99918 99919 99920 99921 99922 99923
99924 99925 99926 99927 99928 99929 99930 99931 99932 99933 99934 99935 99936 99937 99938 99939 99940 99941 99942 99943 99944 99945
99946 99947 99948 99949 99950 99951 99952 99953 99954 99955 99956 99957 99958 99959 99960 99961 99962 99963 99964 99965 99966 99967
99968 99969 99970 99971 99972 99973 99974 99975 99976 99977 99978 99979 99980 99981 99982 99983 99984 99985 99986 99987 99988 99989
99990 99991 99992 99993 99994 99995 99996 99997 99998 99999
可见筛选成功。
接下来利用随机函数生成100000个随机数。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define FILEDIR argv[1]
int main(int argc, char **argv){
FILE *fp = NULL;
fp = fopen(FILEDIR, "w");
if(!fp){
fputs("Read file error.", stderr);
return 1;
}
srand(time(NULL));
for(int i = 0; i < 1e5; i++) fprintf(fp, "%d ", rand());
fclose(fp);
return 0;
}
筛选后结果如下。
32430 32432 32430 32435 32433 32431 32431 32440 32437 32434 32435 32432 32431 32433 32432 32446 32443 32440 32440 32437 32434 32450
32438 32441 32432 32439 32447 32443 32433 32437 32448 32454 32470 32452 32449 32441 32443 32444 32454 32438 32444 32434 32444 32457
32479 32440 32447 32442 32450 32440 32433 32442 32442 32456 32447 32470 32459 32440 32441 32452 32463 32448 32473 32462 32465 32482
32512 32481 32475 32459 32460 32452 32449 32445 32475 32486 32463 32486 32455 32473 32440 32463 32511 32438 32436 32445 32451 32462
32467 32483 32515 32447 32444 32505 32501 32457 32445 32470 32453 32442 32472 32444 32465 32461 32459 32445 32445 32467 32508 32459
32461 32497 32479 32478 32479 32464 32456 32490 32454 32467 32455 32469 32470 32479 32551 32517 32530 32499 32484 32569 32472 32491
32484 32550 32538 32534 32492 32505 32514 32500 32481 32542 32580 32469 32469 32456 32475 32472 32468 32510 32476 32517 32495 32519
32503 32516 32487 32553 32482 32528 32480 32468 32457 32497 32475 32514 32602 32445 32532 32437 32480 32458 32497 32458 32466 32482
32475 32525 32491 32535 32519 32637 32532 32451 32448 32457 32500 32522 32556 32545 32507 32566 32494 32454 32468 32496 32499 32586
32465 32539 32563 32486 32564 32460 32446 32470 32477 32486 32469 32483 32459 32484 32569 32474 32583 32497 32516 32552 32539 32491
32519 32465 32469 32500 32500 32532 32518 32563 32483 32623 32497 32464 32469 32506 32487 32506 32497 32513 32494 32484 32521 32484
32522 32494 32521 32549 32537 32515 32489 32583 32634 32562 32635 32595 32596 32570 32612 32625 32674 32637 32665 32502 32542 32547
32547 32603 32534 32564 32613 32644 32563 32542 32614 32614 32616 32515 32573 32628 32556 32526 32533 32585 32511 32663 32614 32622
32635 32701 32481 32706 32500 32469 32627 32569 32524 32512 32476 32541 32480 32584 32531 32682 32680 32581 32599 32627 32665 32553
32656 32596 32508 32534 32576 32491 32648 32581 32583 32669 32604 32677 32548 32682 32565 32507 32482 32466 32580 32532 32609 32477
32503 32553 32668 32638 32680 32470 32493 32573 32572 32645 32498 32510 32604 32610 32651 32553 32562 32495 32523 32683 32489 32482
32526 32519 32559 32538 32555 32523 32654 32590 32717 32560 32538 32709 32649 32716 32645 32505 32575 32493 32455 32484 32592 32633
32510 32705 32545 32671 32689 32572 32595 32662 32524 32650 32575 32609 32593 32456 32677 32488 32535 32496 32503 32525 32518 32611
32590 32515 32479 32647 32547 32588 32590 32504 32659 32665 32648 32618 32493 32505 32460 32493 32493 32511 32544 32597 32554 32531
32522 32562 32503 32606 32527 32687 32502 32607 32569 32479 32539 32644 32670 32598 32500 32550 32553 32596 32645 32550 32563 32524
32615 32614 32553 32493 32566 32471 32473 32527 32568 32634 32578 32542 32537 32549 32588 32575 32604 32525 32719 32652 32694 32530
32600 32531 32634 32635 32557 32592 32554 32499 32571 32614 32551 32575 32534 32607 32521 32506 32530 32664 32516 32628 32529 32501
32534 32547 32602 32589 32547 32590 32565 32568 32649 32556 32587 32596 32630 32512 32538 32583 32736 32660 32680 32574 32711 32687
32706 32675 32757 32621 32732 32622 32683 32739 32743 32691 32706 32702 32732 32742 32677 32673 32755 32734 32748 32717 32548 32702
32694 32664 32625 32720 32721 32575 32698 32746 32586 32752 32691 32688 32669 32748 32755 32673 32588 32628 32707 32651 32631 32644
32767 32570 32759 32767 32754 32662 32665 32667 32583 32753 32631 32767 32758 32681 32636 32606 32603 32746 32685 32694 32653 32678
32692 32757 32741 32753 32722 32650 32692 32757 32736 32548 32754 32495 32749 32749 32632 32608 32687 32549 32643 32721 32662 32513
32578 32557 32673 32618 32631 32590 32649 32764 32727 32766 32756 32735 32760 32732 32684 32688 32719 32761 32749 32674 32682 32755
32558 32723 32727 32733 32722 32747 32650 32648 32749 32586 32723 32707 32614 32749 32742 32739 32736 32677 32627 32752 32716 32671
32689 32707 32761 32594 32754 32726 32692 32737 32610 32691 32703 32664 32543 32680 32688 32699 32580 32661 32679 32723 32746 32517
32537 32625 32541 32759 32649 32729 32711 32655 32652 32685 32728 32680 32542 32592 32726 32686 32657 32743 32669 32702 32729 32530
32629 32585 32557 32640 32714 32636 32722 32739 32715 32596 32748 32738 32634 32674 32745 32631 32716 32758 32687 32670 32551 32565
32567 32655 32549 32704 32579 32620 32641 32698 32625 32747 32646 32746 32580 32704 32762 32596 32643 32736 32727 32737 32710 32547
32718 32734 32727 32652 32752 32755 32724 32707 32691 32685 32583 32709 32684 32742 32741 32727 32622 32567 32514 32752 32627 32707
32691 32606 32570 32736 32737 32606 32751 32765 32672 32743 32707 32673 32675 32652 32763 32738 32719 32610 32746 32701 32674 32742
32607 32619 32627 32746 32644 32650 32510 32754 32722 32734 32752 32613 32601 32752 32522 32702 32599 32747 32604 32672 32588 32710
32740 32590 32677 32611 32721 32501 32689 32761 32717 32750 32653 32739 32739 32715 32742 32541 32759 32737 32741 32708 32702 32739
32650 32755 32676 32554 32631 32549 32589 32639 32465 32581 32538 32613 32739 32672 32548 32642 32688 32677 32745 32710 32757 32619
32627 32663 32620 32658 32629 32531 32642 32701 32644 32541 32582 32724 32719 32717 32573 32648 32757 32640 32755 32739 32618 32717
32714 32688 32697 32747 32681 32671 32609 32682 32741 32764 32563 32592 32615 32653 32671 32663 32649 32751 32600 32608 32710 32638
32757 32742 32645 32705 32758 32603 32651 32546 32589 32638 32566 32735 32760 32543 32504 32695 32743 32756 32637 32693 32654 32764
32726 32672 32579 32750 32567 32656 32579 32632 32743 32603 32684 32676 32613 32738 32761 32758 32719 32742 32711 32763 32711 32629
32631 32605 32724 32632 32538 32700 32644 32667 32707 32749 32582 32625 32729 32726 32751 32723 32602 32723 32670 32714 32630 32646
32759 32641 32740 32658 32702 32639 32671 32535 32646 32654 32638 32705 32694 32731 32686 32683 32714 32726 32630 32633 32753 32764
32752 32537 32586 32603 32588 32672 32663 32711 32703 32757 32634 32646 32737 32661 32623 32715 32654 32740 32740 32711 32684 32641
32634 32724 32764 32679 32686 32725 32573 32604 32627 32700