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)才是符合逻辑的,你去问问同事到底应该怎么算


