medie2005 发表于 2008-12-24 12:26:19

一些结果:
39095115
131773887
7739930700315
41937083892118prime!
98599265724019
83571347395221
83390422733221
178832003737331
360601294905723
539829315247224
321682991979321
126249063056822
411988323510125
1555497623197827
2400689908498827
6038379908193230
8120176147695635
2734845739126431
1557727486079829
4922438354215833
1970562411111130
7901233326773635
2644054291402431
4641669415406233
12143562529934434
20320057699243536
66295328324937541
42627285320482942
10164273659111036
16533971240646538
40737411697563142
16579745177567638
16522236095531138
281851588097059448
501887898660995249
138257066237193748
485809235207285255
342780712198274053
477590854835242655
195470407500005650
5443749396726077367
4825668346791976266
3660947877894553764prime!
4207589976041185765
1791829283588753559
1523958418606098258
1093078552549452256
3151984914631167363
2730313487267994362
3151585159591346163
9507799711132971766
2996683859533942458
1992779978423989753
1008609201904388953
3509197123763659761
3509191971703165761
4690169655006950563
2103086166505460965
1376957357552081762
8579155747477021776
2136398572708712165
3547464751475602969
6654091011155422674
33526435195700950582
33937785510694836382
21649608953470422878
47419838349468708685
13758895543828529874
38063804903950652883
19158769576041357077
27015591366708496280
13398051112966162174
40433169539226896180
56312799189672513083
17986285079858039473
57922158163027146394
52612985016546677093
18927461755443712683
26042478422927637386
18922066446731222083
13925116481588520180prime!
26933174588654148886
19144550168048004683
52047256112093623493
25736303345439156386
52041304505492616693
126050104036429526995
7036025605643951593115
184549034013698000399
8287635131760043919117
2209243168178007319101
6035143058499257267113
5571359353914741184112
8033208539405974995108
4407336128691989819101
7371504976296298569107
154399971549699521486
5490083550189959519101
156683166901224059993
6535976150169498007109
3302927389750318219101prime!
7074429476239359302110
141659749157062629392
4144420369160277807117
5606262537638424619121
5606262563361475819121
4826006075592303123119
1230472098338175128102
6601884735572840219123
2422648658387709402110
2872784436887110369112
7572181762697312875125
9224502473054552067128

medie2005 发表于 2008-12-24 15:13:32

代码:#include   <cstdlib>
#include   <iostream>
#include   <cmath>
#include   "gmp.h"

using   namespace   std;

const      intL=40000;
mpz_t      Hash;
mpz_t      number;
mpz_t      POW10;

void   Init( ){
        mpz_init_set_ui( Hash, 0 );
    for( unsigned i=1; i<L; ++i ) mpz_init_set_ui( Hash, 1 );
        for( i=0; i<L; ++i ){       
                mpz_init_set_ui( number, 0 );
                for( unsigned j=1; j<10; ++j ){
                        mpz_init( Hash );
                        mpz_mul_ui( Hash, Hash, i );                       
                }
        }
        mpz_init_set_ui( POW10, 1 );
        for( i=1; i<100; ++i ){
                mpz_init( POW10 );
                mpz_mul_ui( POW10, POW10, 10 );
        }               
}

voidSet_num_0( unsigned n ){
        for( int i=0; i<L; ++i )
                mpz_set_ui( number, n );               
}

voidClean( ){
        for( unsigned i=0; i<L; ++i ){       
                mpz_clear( number );
                for( unsigned j=0; j<10; ++j )
                        mpz_clear( Hash );
        }
        for( i=0; i<100; ++i )
                mpz_clear( POW10 );
}

bool   check( mpz_t &n, int *list, int m ){
        int c={0}, d={0};
        for( int i=1; i<m+1; ++i ) c]++;
        char str;
        mpz_get_str( str, 10, n );       
        for( i=0; str!='\0'; ++i )d-'0']++;
        for( i=0; i<10; ++i ) if( c!=d ) return false;
        return true;
}

void   combination(   unsigned   n,   unsigned   m   ){
    int*c=new int, j, *num=new int, g;
    for( j=1; j<=m; ++j )c=j-1, num=c-j+1;
    c=n;
        int start=int(pow(10, (m-1)/9.0)/pow(m,1/9.0)), t=start;       
R2: //copy( num+1, num+m+1, ostream_iterator<int>(cout," ") ),cout<<endl;       
        if( c>m-1 ){
                if( mpz_cmp( number, POW10 )>0 ){
                        for( start=t; start<2*t; ++start ){               
                                if( mpz_cmp( number, POW10 )>0 )start=2*t+1;
                                else
                                        if( check( number, num, m ) ){                               
                                                mpz_out_str( stdout, 10, number );
                                                printf("%d",start);
                                                if( mpz_probab_prime_p( number, 10 ) )
                                                        printf("prime!");
                                                printf("\n");                               
                                        }                       
                        }
                }
        }          
    if( m&1 )
      if( c+1<c ){
                        for( g=t; g<2*t; ++g ){
                                mpz_sub( number, number, Hash] );
                        }
            ++c, ++num;
                        for( g=t; g<2*t; ++g ){
                                mpz_add( number, number, Hash] );
                        }
                        goto R2;
      }
      else{
            j=2;goto R4;
      }
                else
                        if( c>0 ){
                                for( g=t; g<2*t; ++g ){
                                        mpz_sub( number, number, Hash] );
                                }
                                --c, --num;
                                for( g=t; g<2*t; ++g ){
                                        mpz_add( number, number, Hash] );
                                }
                                goto R2;
                        }
                        else{
                                j=2;goto R5;
                        };
R4:    if( c>=j ){
                   for( g=t; g<2*t; ++g ){
                           if( j<=m )
                                   mpz_sub( number, number, Hash] );
                           if( j-1<=m )
                                   mpz_sub( number, number, Hash] );
                   }                  
                   c=c, num=c-j+1;c=j-2, num=c-(j-1)+1;                  
                   for( g=t; g<2*t; ++g ){
                           if( j<=m )
                                   mpz_add( number, number, Hash] );
                           if( j-1<=m )
                                   mpz_add( number, number, Hash] );
                   }
                   goto R2;
           }
           else
                   ++j;
R5:    if( c+1<c ){                  
                   for( g=t; g<2*t; ++g ){
                           if( j<=m )
                                   mpz_sub( number, number, Hash] );
                           if( j-1<=m )
                                   mpz_sub( number, number, Hash] );
                   }
                   c=c, num=c-(j-1)+1;c=c+1, num=c-j+1;
                  
                   for( g=t; g<2*t; ++g ){
                           if( j<=m )
                                   mpz_add( number, number, Hash] );
                           if( j-1<=m )
                                   mpz_add( number, number, Hash] );
                   }
                  
                   goto R2;
           }
           else{
                   ++j;
                   if( j<=m )    goto R4;
           }
           delete []c;
           delete []num;
}

int   main(int   argc,   char   *argv[])
{
        Init();
    for( unsigned i=3; i<=18; ++i ){
                Set_num_0( i );
                cout<<i<<" digits search start!\n";      
                combination( i+9, i );
    }
    Clean( );
    cout<<"press any key to continue...\n";
    cin.get();   
    return EXIT_SUCCESS;
}

无心人 发表于 2008-12-24 19:45:06

如果考虑9..0的单调递减序列
也许能得到全部解

medie2005 发表于 2008-12-24 20:33:09

那你做做看啊。:lol :lol :lol
23 digits search start!
72374194476756069205463321prime!
26422727075326705619519287
23369275182001540983167283
15307891248046600369714270
81156000928437353043779325
88150077514629769451546328
36083215428634110977759297prime!
24122609017228438923562284
74658900958504521623135322
41930548255879225151204302
18120785812809735496103275
66927307822924784608184318
83684819395021675123823326
14343996440308686746138268
18088196614511100077279275
95819846877371720464703331prime!
21270792708795826504283280
14832743436587440945891269
59630841033488437373952314
19942323847352038835072278
39562832189446281361201300
39562832918446281360602300
11305333082883943259543261
66612933025012790825133318
14778011952046745065439269
72486576766263162199063321prime!
22597217327585752660759282prime!
22597217823373667296734282
26468759137170309661725287
81031149661447601291327325
49621103054709073136959285
21038524308930890572199259
46697261888319509272709283
24940929768415003677579264
67737789499145056223291295
29779858296577179839939253
51289949659697722608041279
31146577799502195931297264
13219073586947696543725254
31773554298759363406961280
59246050891868100090607300
18758609226422112396890264
28976651734884860990843277
33994888681644746414952282
38497141929504440682503286
19383469040737282336967265
44994080613434557855793291
15195003646025564342799258
14673312466007735691799257
34930339660070335619147283
31735639651530947406962280
25269054459617449066407273
18595637250571325410214298
27305844273903773420543311
13257556274267026251839287
22915753760002786215463305
16467047928613571262541294
49153322466355208662117332
18720020685302595548726298
19880487560462427270304300
19880050160446200181207300
14758304773867785198871290
88536834649328820157363354
88536834649360183744580354
29202388044817616004815313
18782211348680297544005298
35404621236372898100163320
67849604431150484346035344
29863275425252576001768314
10317338106477745928753279
20416186535341030584923301
24 digits search start!
354665532646065133929216383
112124135925391604401320337
437129646972257352317456392
457614941054750379432060394
153624554507256393112296349
260625983192005163033814370
869207861507614975320762423
214096790127681751538226362
481365058252096019045884396
602418694082816615582049406
373619668262400209873688385
104074634608850692978080334
189440085796550586624800357
835875118623844438193904421
853907714843460879808003422
891001198761584541082827424
125601692898807378284264341
281391262593836556856884373
686569533864055104764958412
686569533828413462621097412
189177722863461132693648357
701715859696534378782704413
987793576087832632011040429
225284713459648685607129364
198925685231354810406004359
490563597202315131711768397
273214976200075100892641372
266676559020729517682164371
273214973571355911836352372
121613620033947657895422340
170459239740545110164856353
416509403411192994103344361
171259769006513093829846327
818465606798425929922808389
484109499266774059048278367
673077926439106993196394364
299377962806202991779926327
589574000759254953914529366
929699742411420632623896385
807999509087938024311156379
214139475445969926198288327
548385999937603819238150363
295992663487794453856960339
131955343102113915185529328
312672096972930846551424361
297425941174237756260598359
197329230129436210502826343
213415300822299791566344346
155645946809864524680396334
213827889675779026113129346
243290721689808771936674351
297976981853466442478164359
100284905958118051935688318
754898065391888177417927398
807649291192283188846424401
922344381918387870921216407
243519789801901381758524351
430269109280353116849750374
719633244899261740204874396
182509718964663492772161340
255810773797545967582936353
390589621617690427333812370
400191853859024097755434371
532001906706327956933372383
439951424937660070453504375
124762017212135136459299326
924203678225011567566522460
837645433609376463653402455
214146750636487497611274391
214148137075756507593474391
205536325655808734937480389
427462727286409805674866422
661556409574358048281334443
844985028324148811426146455
878985830807357626347576457
880875863245518508316976457
562834694540208845445078435
718858147491516762158014447
967225587818513520207482462
264768729088102400480406400
537525851206744973400648433
127524720914542447686856369
454505698184624560143352425
25 digits search start!
3025216251120602469400295486
3906265672000000125750509500
4426954045326617954277571507
1314209631413466095537215443
2814190134354195006286005482
7316849305193311275583650536
2117448637932319016845101467
6282759081625457026336229527
2762100801984442967241625481
9227510487495164483356651550
3575664876941654284577295495
6176318761915529057285725526
7954440288905470517110465541
7954440288905470517402065541
5866452931050248239675321523
5106676592341262086028933515
5877659134522951648864801523
1402778368491403502886695446
3151995316860483408471458488
6408959745854602858648322528
2083674691647868743819850466
2332850714164805299661386472
5293044387569112788460673517
7961805448437229773176185541
6846372801964862914427737532
7323687410797225985156850536
9235883825922671215514701550
4765327260188591166849535511
3266810694818614794172141490
5575870286920338693434122520
5013270646112938402004092514
4353275191840931731733425506
7947102357042166103849665541
2657697566123323235189275479
5375504891695201474725055518
1163767927486677676616209437
3637511924712914820341410496
5210902707965600997557635478
2907794705234332299051460448
1850363349196017093792825426
1496040389891087292583140416
9521328973269586981684225511
5028453892938441682976925476
1931144935680979048228342428
8405838430939254393635907504
1098767943059501806557892402
2011541998633439730526093430
7404347169346108395192921497
4921894643929380658591957454
3939200103996394322311680452
7997037699867041571593601489
1826474602229179979234911415
9598947267154104843261499499
5454414169009546822055395496
2182467796906349613102403448
5356259201179166308179033495
6187596352112953467354159503
5259670321807937215559603494
5969684437944314577310525501
6195791806000314987803041503
3237891133492583476242984468
1479964127080277913484841429
2614068904346069852287129457
8810869493918143318746211523
5377885985882495392884225495
3178425468995208984341555467
6089851294146058012468915502
8207040798131666291927361519
9744787529574271296140857529
2413495872938562070790337453
4544074697713811287469695486
1170581208491910912501754418
6073759375320471445370929502

无心人 发表于 2008-12-24 21:03:23

我前面不是求出所有的9位以下的来了么?

medie2005 发表于 2009-1-12 08:50:26

一个35位的结果:
306039543061103525405540642067794036285
页: 1 2 [3]
查看完整版本: 自缚数