无心人 发表于 2008-7-10 21:07:12

另外,GxQ的代码完全不用事后计算平方阿
当时填充结果的时候就可以复制过去的

或者说,是否根本不用记录平方的根
就闷头搜索平方就可以了

:lol

gxqcn 发表于 2008-7-10 21:11:58

原帖由 无心人 于 2008-7-10 21:07 发表 http://bbs.emath.ac.cn/images/common/back.gif
另外,GxQ的代码完全不用事后计算平方阿
当时填充结果的时候就可以复制过去的

这个想法是不错,甚至可以考虑直接存储输出的字符串。

但我那个程序,主要是想直接存平方根,仅4Bytes,比较节省内存,
而后期展开的运算代价很小。

无心人 发表于 2008-7-10 21:15:32

:)

超过2^32再存平方根就比较麻烦了阿
另外在这个程序里
内存节约的很
呵呵

无心人 发表于 2008-7-10 21:44:53

157   28979978999958969889
20位内无更高的结果了
要对GxQ代码动大手术
去掉很多无用的代码
呵呵明天抽时间做下

呵呵,计算出145消耗的时间缩小到48秒
如果是GxQ机器还快吧
#include <stdlib.h>
#include <stdio.h>


#define TEN_POW2    100UL
#define TEN_POW4    10000UL

int main( void )
{
    unsigned long table[ TEN_POW4 ];
    unsigned long mark[ 9*32 + 1 ];
    unsigned long value[ 8 ], delta[ 8 ];
    unsigned long * p = table;

    unsigned long i, j, k, m, s;
    long t;
    unsigned long i2, i3, i4, s2, s3;

    for ( i4 = 0; i4 < 10; ++i4 )
    {
      for ( i3 = 0; i3 < 10; ++i3 )
      {
            s3 = i4 + i3;
            for ( i2 = 0; i2 < 10; ++i2 )
            {
                s2 = s3 + i2;
                for ( i = 0; i < 10; ++i )
                {
                  *p++ = s2 + i;
                }
            }
      }
    }

    for (i=0; i < 8; i ++)
    {
       value = 0;
       delta = 0;
    }

    for (i = 0; i < 9*32 + 1; i ++)
      mark = 0;

    value[ 0 ] = 0;
    delta[ 0 ] = 1;
    m = 1;
    for ( ; ; )
    {
      s = 0;
      for ( i = 0; i < m; ++i )
      {
            value[ i ] += delta[ i ];
            if ( value[ i ] >= TEN_POW4 )
            {
                value[ i ] -= TEN_POW4;
                ++value[ i + 1 ];
            }

            s += table[ value[ i ] ];
      }
      
      if (value)
      {
          m++;
          s++;
      }

      if ( 0 == mark[ s ])
      {
      mark = 1;
      printf("%d    ", s);
      for (t=7;t>=0;t--)
          printf("%04d", value);
      printf("\n");
      }

      if (m >= 9)
         break;

      delta[ 0 ] += 2;

      i = 0;
      while ( delta[ i ] >= TEN_POW4 )
      {
            delta[ i ] -= TEN_POW4;
            ++delta[ ++i ];
      }
    }

    s = 0;
    i = 0;
    printf( "\n" );

    return 0;
}

[ 本帖最后由 无心人 于 2008-7-11 07:37 编辑 ]

无心人 发表于 2008-7-11 07:41:13

GxQ代码存在一个隐含的Bug
计算数位和没计算进位

就是说如果恰好进位到高位产生
他没加进位到s

结果10000会被计算到mark中
但因为mark不输出
所以看不到
呵呵

mathe 发表于 2008-7-11 07:42:21

现在证明了猜想:
那么请问,是否对于每个9的倍数或模3余1的正整数,都存在一个完全平方数,数字之和是这个正整数

我们考虑
$(10^n-1)^2, (10^n-2)^2, (10^n-3)^2, (10^n-5)^2$
它们的结果非常规律,在$n>=2$时,数字和分别为$9n,9n+1,9n+4,9n-2$
所以我们只要在找到数字和为$1,4,7,9,10,13$的平方数,就完全证明了这个问题。

无心人 发表于 2008-7-11 07:51:52

:b:

gxqcn 发表于 2008-7-11 08:01:18

原帖由 无心人 于 2008-7-11 07:41 发表 http://bbs.emath.ac.cn/images/common/back.gif
GxQ代码存在一个隐含的Bug
计算数位和没计算进位

就是说如果恰好进位到高位产生
他没加进位到s

结果10000会被计算到mark中
但因为mark不输出
所以看不到
呵呵

mark[] 并未采用 10000 进制,应该没有你说的 bug 吧?

无心人 发表于 2008-7-11 08:09:37

呵呵
你看看你程序的mark的全部输出
而不是部分结果哦

无心人 发表于 2008-7-11 08:40:06

153    00000000000005899989587897999889
151    00000000000006979497898999879969
154    00000000000008899988895999696889
157    00000000000028979978999958969889
160    00000000000078897999969769888996
162    00000000000087989899898866889889
163    00000000000199989299899788979969
166    00000000000449998999899988698769
页: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16
查看完整版本: 平方数数字和