| 
注册时间2008-2-6最后登录1970-1-1威望 星金币 枚贡献 分经验 点鲜花 朵魅力 点上传 次下载 次积分51605在线时间 小时 
 | 
 
 发表于 2008-7-14 10:43:56
|
显示全部楼层 
| 修改后代码
基本维持GxQ原意
#include 
#include 
#include 
#define TEN_POW2    100UL
#define TEN_POW4    10000UL
#define UINT32 unsigned long
#define LIMBS       5
UINT32 m, s;
UINT32 pool[ TEN_POW4 + LIMBS * 39 + 1 ];
#define table(x)    pool[x]
#define value(x)    pool[(x) + TEN_POW4]
#define delta(x)    pool[(x) + TEN_POW4 + LIMBS]
#define index(x)    pool[(x) + TEN_POW4 + LIMBS * 2]
#define exist(x)    pool[(x) + TEN_POW4 + LIMBS * 3 + 1]
void init( void )
{
    UINT32 i1, i2, i3, i4;
    UINT32 * p = &table(0) - 1;
    memset( pool, 0, sizeof( pool ));
    for ( i1 = 0; i1 < 10; ++i1 )
    {
        for ( i2 = 0; i2 < 10; ++i2 )
        {
            for ( i3 = 0; i3 < 10; ++i3 )
            {
                for ( i4 = 0; i4 < 10; ++i4 )
                {
                    *(++p) = i1 + i2 + i3 + i4;
                }
            }
        }
    }
}
void sumOfDigits( void )
{
    s = 0;
    for ( UINT32 i = 0; i <= m; ++i )
    {
        value(i) += delta(i);
        if ( value(i) >= TEN_POW4 )
        {  /* 当 i==m 时不会进入,因此时平方根<100^(m+1) */
            value(i) -= TEN_POW4;
            ++value(i+1);
        }
        s += table( value(i) );
    }
}
#define add_value(x)        value(x) += delta(x)
#define mod_value(x)        if ( value(x) >= TEN_POW4 ){ value(x) -= TEN_POW4; ++value(x+1); }
#define lookup(x)           table( value(x) )
void sumOfDigits_1( void )
{
    add_value(0);
    s = lookup(0);
}
void sumOfDigits_2( void )
{
    add_value(0);
    add_value(1);
    mod_value(0);
    s = lookup( 0 ) + lookup( 1 );
}
void sumOfDigits_3( void )
{
    add_value(0);
    add_value(1);
    add_value(2);
    mod_value(0);
    mod_value(1);
    s = lookup( 0 ) + lookup( 1 ) + lookup( 2 );
}
void sumOfDigits_4( void )
{
    add_value(0);
    add_value(1);
    add_value(2);
    add_value(3);
    mod_value(0);
    mod_value(1);
    mod_value(2);
    s = lookup( 0 ) + lookup( 1 ) + lookup( 2 ) + lookup( 3 );
}
void sumOfDigits_5( void )
{
    add_value(0);
    add_value(1);
    add_value(2);
    add_value(3);
    add_value(4);
    mod_value(0);
    mod_value(1);
    mod_value(2);
    mod_value(3);
    s = lookup( 0 ) + lookup( 1 ) + lookup( 2 ) + lookup( 3 ) + lookup( 
4 );
}
void sumOfDigits_6( void )
{
    add_value(0);
    add_value(1);
    add_value(2);
    add_value(3);
    add_value(4);
    add_value(5);
    mod_value(0);
    mod_value(1);
    mod_value(2);
    mod_value(3);
    mod_value(4);
    s = lookup( 0 ) + lookup( 1 ) + lookup( 2 ) + lookup( 3 ) + lookup( 
4 ) \
        + lookup( 5 );
}
void sumOfDigits_7( void )
{
    add_value(0);
    add_value(1);
    add_value(2);
    add_value(3);
    add_value(4);
    add_value(5);
    add_value(6);
    mod_value(0);
    mod_value(1);
    mod_value(2);
    mod_value(3);
    mod_value(4);
    mod_value(5);
    s = lookup( 0 ) + lookup( 1 ) + lookup( 2 ) + lookup( 3 ) \
        + lookup( 4 ) + lookup( 5 ) + lookup( 6 );
}
typedef void ( *lpfnSumOfDigits )( void );
lpfnSumOfDigits lpfn[ ] = { sumOfDigits, sumOfDigits_1, sumOfDigits_2, 
sumOfDigits_3, \
    sumOfDigits_4, sumOfDigits_5, sumOfDigits_6, sumOfDigits_7 };
int main( void )
{
    UINT32 i;
    struct timeval start, end;
    double timeuse;
    lpfnSumOfDigits SumOfDigits = lpfn[ 1 ];
    gettimeofday(&start, NULL);
    init();
    
    index(0) = 1;
    delta(0) = -1;
    m = 0;
    for ( ; ; )
    {
        delta(0) += 2;
        if ( delta(0) > TEN_POW4 )
        {
            delta(0) = 1;
            i = 0;
            while ( TEN_POW4 == ++delta(++i) )
            {
                delta(i) = 0;
            }
        }
        SumOfDigits();
        if ( 0 == exist(s) )
        {
            exist(s) = 1;
            gettimeofday(&end, NULL);
            timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
            timeuse /= 1000000;
            printf( "%6.6f", timeuse );
            printf( "\tX = %u\t\tS = %u", s, value( i = m ) );
            while ( 0 != i )
            {
                printf( "%04u", value(--i) );
            }
            printf( "\n" );
        }
        i = -1;
        while ( TEN_POW2 == ++index(++i) )
        {
            index(i) = 0;
        }
        if ( m < i )
        {
            m = i;
            gettimeofday(&end, NULL);
            timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
            timeuse /= 1000000;
            printf( "\n****** %6.6f: Searched all perfect squares less then 10^%u ******\n\n", timeuse, 4*m );
            if ( LIMBS == i )
            {
                break;
            }
#if ( LIMBS > 7  )
            if ( m + 1 >= sizeof( lpfn ) / sizeof( lpfn[0] ))
            {
                SumOfDigits = lpfn[ 0 ];
            }
            else
#endif
            {
                SumOfDigits = lpfn[ m + 1 ];
            }
        }
        else if ( i == m && 10 == index(m) )
        {
            gettimeofday(&end, NULL);
            timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
            timeuse /= 1000000;
            printf( "\n****** %6.6f: Searched all perfect squares less then 10^%u ******\n\n", timeuse, 4*m + 2 );
        }
    }
  gettimeofday(&end, NULL);
  timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
  timeuse /= 1000000;
    printf( "\nComputation took %6.6f\n\n", timeuse );
    system( "pause" );
    return 0;
}
////////////////////
可以看出,所用时间远大于我原来贴的时间
下面我贴我修改的他原始程序的代码 | 
 |