uint32 能表示的最大值为 4294967295,也就是不足43亿。如果用uint64,那就可以表示一千八百亿亿,足够你用了
不过,我最大的疑惑还是10楼说的,对于
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@
你一开始的代码计算出 aaaaaaaa 数目为 4
后来在7楼又说数目应该为10
其实我觉得,你一开始(为4)才是符合逻辑的,你去问问同事到底应该怎么算
程序代码:
#include <stdio.h> #include <string.h> #include <assert.h> void dna8_val2str( unsigned long val, char str[8] ) { assert( val < (1ul<<(8*2)) ); for( size_t i=0; i<8; ++i ) { str[7-i] = "agct"[val%4]; val >>= 2; } } const char* ifilename = "result1.txt"; const char* ofilename = "result2.txt"; int main() { unsigned long long words = 0; unsigned long long numbers[65536] = { 0 }; // 处理 FILE* fin = fopen( ifilename, "r" ); if( !fin ) { printf( "Cannot open \"%s'.\n", ifilename ); return 1; } int bav = 0; unsigned long val = 0; for( int c; c=fgetc(fin), c!=EOF; ) { switch( c ) { case '@': // 遇到@则结束 break; case '\r': case '\n': ++words; //bav = 0; continue; case 'a': case 'g': case 'c': case 't': val = ((val<<2)&0xFFFF) | (c%36%5); if(bav<7) // 不足8个有效字符时先等等 ++bav; else ++numbers[val]; break; default: // 出现了agct之外的字符 { fpos_t pos; fgetpos( fin, &pos ); if( c>0x20 && c<0xFF ) // 可显示的字符,就显示其本身 printf( "--- 0x%016llX处出现非法字符\'%c\'\n", pos-1, (char)c ); else // 不可显示的字符,就显示其对应的ASCII值 printf( "--- 0x%016llX处出现非法字符0x%02hhX\n", pos-1, (char)c ); } } } fclose( fin ); // 输出 FILE* fout = fopen( ofilename, "w" ); if( !fout ) { printf( "Cannot open \"%s'.\n", ofilename ); return 3; } fprintf( fout, "The Number of total words are %lld\n", words ); fprintf( fout,"The Expect Number words are %f\n", words/65536.0 ); for( int i=0; i<65536; ++i ) { // if( numbers[i] !=0 ) { char str[8]; dna8_val2str( i, str ); fprintf( fout, "%.8s\t%lld\t%f\n", str, numbers[i], numbers[i]/65536.0 ); } } fclose( fout ); printf( "处理完毕\n" ); return 0; }
不过,我最大的疑惑还是10楼说的,对于
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@
你一开始的代码计算出 aaaaaaaa 数目为 4
后来在7楼又说数目应该为10
其实我觉得,你一开始(为4)才是符合逻辑的,你去问问同事到底应该怎么算