medie2005 发表于 2009-1-12 08:45:10

40位以下的回归数及其扩展:
3 digits search start!
0
1
153
407
370
371
4 digits search start!
0
1
1634
8208
9474
5 digits search start!
0
1
4151
4150
54748
93084
92727
6 digits search start!
0
1
548834
7 digits search start!
0
1
1741725
4210818
9926315
9800817
8 digits search start!
0
1
24678050
24678051
88593477
9 digits search start!
0
1
146511208
912985153
534494836
472335975
10 digits search start!
0
1
4679307774
11 digits search start!
0
1
82693916578
94204591914
40028394225
44708635679
42678290603
49388550606
32164049651
32164049650
12 digits search start!
0
1
13 digits search start!
0
1
564240140138
14 digits search start!
0
1
28116440335967
15 digits search start!
0
1
16 digits search start!
0
1
4338281769391371
4338281769391370
17 digits search start!
0
1
233411150132317
35875699062250035
35641594208964132
21897142587612075
18 digits search start!
0
1
19 digits search start!
0
1
3289582984443187032
4498128791164624869
4929273885928088826
1517841543307505039
20 digits search start!
0
1
63105425988599693916
21 digits search start!
0
1
449177399146038697307
128468643043731391252
22 digits search start!
0
1
23 digits search start!
0
1
21887696841122916288858
35452590104031691935943
28361281321319229463398
27907865009977052567814
27879694893054074471405
24 digits search start!
0
1
188451485447897896036875
174088005938065293023722
239313664430041569350093
25 digits search start!
0
1
114735624485461118832514
1550475334214501539088894
1553242162893771850669378
4422095118095899619457938
3706907995955475988644380
3706907995955475988644381
832662335985815242605071
832662335985815242605070
26 digits search start!
0
1
27 digits search start!
0
1
7584178683470015004720746
121270696006801314328439376
121204998563613372405438066
128851796696487777842012787
177265453171792792366489765
174650464499531377631639254
77888878776432530886487094
28 digits search start!
0
1
29 digits search start!
0
1
477144170826130800418527003
19008174136254279995012734741
19008174136254279995012734740
23866716435523975980390369295
14607640612971980372614873089
5022908050052864745436221003
4716716265341543230394614213
30 digits search start!
0
1
31 digits search start!
0
1
793545620525277858657607629822
2309092682616190307509695338915
1927890457142960697580636236639
1145037275765491025924292050346
32 digits search start!
0
1
17333509997782249308725103962772
33 digits search start!
0
1
186709961001538790100634132976990
186709961001538790100634132976991
32186410459473623435614002227248
34 digits search start!
0
1
1122763285329372541592822900204593
35 digits search start!
0
1
5250083909873201044638631458484846
12639369517103790328947807201478392
12679937780272278566303885594196922
7673249664848285722449710136138169
36 digits search start!
0
1
91097771122214850683543503173498149
37 digits search start!
0
1
418510620208153136884574959404115822
1219167219625434121569735803609966019
618670315011216949642642321868915308
38 digits search start!
0
1
7403697806790834730831423191927508283
7320233109580046612992702336326619665
12815792078366059955099770545296129367
39 digits search start!
0
1
115132219018763992565095597973971522401
115132219018763992565095597973971522400
83281830613691836766959173718984508549
83281823928125880164896079973522049472
16427762135335641330720936105651700735
time : 13426313 ms
press any key to continue...

无心人 发表于 2009-1-12 08:50:36

和我的结果对照了么?

另外, 你的时间多了

wayne 发表于 2010-3-23 13:12:34

一个调用了gmp库,
一个是 纯C写的,
很强大

wayne 发表于 2010-3-23 15:53:13

回归数
又叫Narcissistic Number
(自恋的数)
:lol

youyouyou 发表于 2010-5-6 23:09:14

又称自幂数?

wayne 发表于 2010-5-7 10:10:48

不错,这么翻译好像挺到位的

litaoye 发表于 2011-5-12 22:50:52

没想到这里也讨论过这个问题,前两天用c#写了1个,增加了一个提前剪枝的步骤,求所有88个大概1分钟左右吧。

甜酒哥 发表于 2013-4-12 17:16:17

我的39位的2个
1151322190**...**22401
1151322190**...**22400
好像是连续的,有意思。。
209秒的样子

甜酒哥 发表于 2013-4-12 17:17:07

/*21位水仙花数问题
耗时: 约11s
By: 牧马
At: 2012年1月15日
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define DIG 39
#define LIMIT 7
#define MAX 100

char ncf;
char ncf21bei;
//char goal;

//字符串相加函数
void add_str(char x[], const char y[])
{
    int i, temp, lenx, leny;

    for(i=0,temp=0; x!='\0' && y!='\0'; i++)
    {
      temp=x-'0'+y-'0'+temp;
      x=temp%10+'0';
      temp/=10;
    }
    lenx=strlen(x);
    leny=strlen(y);
    while(i<lenx)
    {
            temp=x-'0'+temp;
      x=temp%10+'0';
      temp/=10;
               i++;
    }
    while(i<leny)
    {
      temp=y-'0'+temp;
      x=temp%10+'0';
      temp/=10;
               i++;
    }
    while(temp)
    {
      x=temp%10+'0';
      temp/=10;
      i++;
    }
    x='\0';
}

//字符串乘以一个整数
int chengyi_str(char x[], int n)
{
    char temp, i, j;

    if(n<=0)
    {
      x='0';
      x='\0';
      return 0;
    }
    else
    {
      strcpy(temp, x);
      i=1;
      while(i<n/2) i*=2;
      j=i;
      for(; i>1; i/=2)
            add_str(x, x);
      while(j<n)
      {
            add_str(x, temp);
            j++;
      }
      return 0;
    }
}

void init()
{
    int i,j;
    ncf='0';
    ncf='\0';
    ncf='1';
    ncf='\0';
    for(i=2; i<10; i++)
    {
      ncf=i+'0';
      ncf='\0';
      for(j=1; j<DIG; j++)
      {
            chengyi_str(ncf, i);
      }
    }
    for(i=0; i<10; i++)
    {
      ncf21bei='0';
      ncf21bei='\0';
      strcpy(ncf21bei, ncf);
      for(j=2; j<=DIG; j++)
      {
            strcpy(ncf21bei, ncf21bei);
            add_str(ncf21bei, ncf);
      }
    }
    /*for(i=0; i<10; i++)
    {
      for(j=0; j<=DIG; j++)
      printf("%d的%d倍:%s\n", i, j, ncf21bei);
      system("pause");
    }*/
}

//穷举法搜索
/*void find()
{
    chara, b;
    int i, k, cnta, cntb;
    //cnta\cntb统计当前数a\b中各数字出现的次数
    //a为当前要判断的数,b为对a求出的水仙花数,c为b排序后的数
    memset(a,0,(DIG+10)*sizeof(char));
    memset(cnta,0,10*sizeof(int));
    for(i=0; i<DIG-1; i++)
    {
      a='0';
      cnta++;
    }
    a='1';
    cnta++;
    a='\0';
    do
    {
      //初始化数据
      memset(b,0,(DIG+10)*sizeof(char));
      memset(cntb,0,10*sizeof(int));
      b='0';
      b='\0';
      //计算b
      for(i=0; i<10; i++)
      {
            if(cnta)
            add_str(b, ncf21bei]);
      }
      for(i=0; b!='\0'; i++)
            cntb-'0']++;
            cntb+=DIG-i;
      //判断是否是水仙花数
      for(i=0; i<10; i++)
            if(cnta!=cntb)
            break;
      if(i==10 && strlen(b)==DIG)
      {
              for(i=DIG-1; i>=0; i--)
              printf("%c", b);
            printf("\n", b);
            printf("已耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
      }
      //取下一个要判断的数
      i=DIG-1;
      while(i>=0 && a=='9')
      {
            cnta-'0']--;
            i--;
      }
      if(cnta-'0'])
      cnta-'0']--;
      k=a+1;
      while(i<DIG)
      {
            cnta++;
            a=k;
      }
    }while(a!='9');
}*/

int na, nb;
char b;
void dfs(int step, int nn)
{
        int i;
    if(nn==0)//step==10 ||
    {
            //不是DIG位数直接否决
      if(b!='\0') return;
               memset(nb,0,sizeof(nb));
               for(i=0; b!='\0'; i++)
              nb-'0']++;
      //判断是否是水仙花数
                for(i=0; i<10; i++)
                        if(na!=nb)
                                return;
                //打印出水仙花数
                for(i=DIG-1; i>=0; i--)
                        printf("%c", b);
                printf("\n");
                //printf("已耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
                return;
    }
    char temp="\0";
    if(step==9)
    {
            strcpy(temp, b);
            na=nn;
            if(nn)
                    add_str(b, ncf21bei]);
            dfs(10, 0);
            strcpy(b, temp);
            na=0;
            return ;
    }
    if(step<9)
    {
            //下列语句可以缩短程序运行时间,但是理论上影响程序的准确性
            /*==============================*/
            if(na>LIMIT) return;
            /*==============================*/
           
            for(i=0; i<=nn; i++)
            {
                    strcpy(temp, b);
                    na=i;
                    if(i)
                            add_str(b, ncf21bei);
                    dfs(step+1, nn-i);
                    strcpy(b, temp);
                    na=0;
            }
            return ;
    }
}

int main()
{
    char x="5", y="9";
    int n=5;
    init();
    dfs(0, DIG);//深度优先搜索
    //system("pause");
    //find();//穷举搜索
    printf("\n共耗时:%fs\n", 1.0*clock()/CLOCKS_PER_SEC);
    return 0;
}

云梦 发表于 2013-6-2 11:05:35

除0以外是否存在a0a1a2.........an=a0^a0+a1^a1+a2^a2+an^an
a0a1a2......an表示整数中的某一位。a0第一位,a1第二位.......。
页: 1 2 3 4 [5] 6
查看完整版本: 回归数