bnghtz

tiz_jegyu_kulonbozo_szamu_oszto_szamparok_szamossaga.pl

Feb 22nd, 2014
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.59 KB | None | 0 0
  1. #! /usr/bin/perl
  2.  
  3. =pod
  4.     Hany olyan a, b szampar van amelyikre igaz?
  5.     - a es b tizjegyu,
  6.     - minden szamjegybol pontosan egyet tartalmazo szam,
  7.     - es b/a > 1 egesz. Vagyis a osztoja b-nek.
  8.    
  9.     Pl.: 9 876 543 120 / 1 234 567 890 = 8
  10.     a) 1 - 10 db
  11.     b) 11 - 100 db
  12.     c) 101 - 1 000 db
  13.     d) 1 001 - 10 000 db
  14.     e) >10 000 db
  15. =cut
  16.  
  17. # 1: kigyujtes
  18. # 2: ellenorzes
  19. # kicsit memoria igenyes. 1.2GB RAM nem art hozza.
  20. # ha optimalizaljuk 1-5 -el kezdodo szamokra, eleg 580 MB is.
  21.  
  22. my $debug_level = 0;
  23.  
  24. my %list = [];
  25. my $db;
  26. my $limit = 9876543210;
  27. my $sum = 0;
  28. foreach (0 .. 9) { $sum += $_; };
  29.  
  30. # fuggveny: ellenorizi, hogy a bemeneti szam szamjegyei mind kulonbozoek-e
  31. sub haveDifferentNumbers($)
  32. {
  33.   my @a = (split('', $_[0]));
  34.   for (my $x = 0; $x <= $#a; $x++)
  35.   {
  36.     for (my $y = $x + 1; $y <= $#a; $y++)
  37.     {
  38.       return 0 if $a[$x] == $a[$y];
  39.     }
  40.   }
  41.   return 1;
  42. }
  43.  
  44. #===== kulonbozo szamokbol allo, 10 szamjegyu szamok legyartasa =====
  45. #
  46. # mennyi valtozo kell majd?
  47. # 0123456789
  48. # abcdefghij
  49.  
  50. # azert eleg 4-ig menni, mert 498... *2 a legnagyobb szam, amit beleszamithatunk a feladatba
  51. my $opt_max = 4;
  52. foreach my $a (1 .. $opt_max)
  53. {
  54.   foreach my $b (0 .. 9)
  55.   {
  56.     next if ($b == $a);
  57.     foreach my $c (0 .. 9)
  58.     {
  59.       next if ($c == $a || $c == $b);
  60.       foreach my $d (0 .. 9)
  61.       {
  62.         next if ($d == $a || $d == $b || $d == $c);
  63.         foreach my $e (0 .. 9)
  64.         {
  65.           next if ($e == $a || $e == $b || $e == $c || $e == $d);
  66.           foreach my $f (0 .. 9)
  67.           {
  68.             next if ($f == $a || $f == $b || $f == $c || $f == $d || $f == $e);
  69.             foreach my $g (0 .. 9)
  70.             {
  71.               next if ($g == $a || $g == $b || $g == $c || $g == $d || $g == $e || $g == $f );
  72.               foreach my $h (0 .. 9)
  73.               {
  74.                 next if ($h == $a || $h == $b || $h == $c || $h == $d || $h == $e || $h == $f || $h == $g);
  75.                 foreach my $i (0 .. 9)
  76.                 {
  77.                   next if ($i == $a || $i == $b || $i == $c || $i == $d || $i == $e || $i == $f || $i == $g || $i == $h);
  78.                   foreach my $i (0 .. 9)
  79.                   {
  80.                     next if ($i == $a || $i == $b || $i == $c || $i == $d || $i == $e || $i == $f || $i == $g || $i == $h);
  81.  
  82.                     foreach my $j (0 .. 9)
  83.                     {
  84.                       next if ($j == $a || $j == $b || $j == $c || $j == $d || $j == $e || $j == $f || $j == $g || $j == $h || $j == $i);
  85.                      
  86.                       # szamok redundanci mentes tarolasa asszociativ tomb kulcskent
  87.                       $list{$a.$b.$c.$d.$e.$f.$g.$h.$i.$j} = '' if $a+$b+$c+$d+$e+$f+$g+$h+$i+$j == $sum;
  88.                      
  89.                       if ($debug_level > 1)
  90.                       {
  91.                         print $a.$b.$c.$d.$e.$f.$g.$h.$i.$j."\n" unless $#list > 10;
  92.                       }
  93.                     }
  94.                   }
  95.                 }
  96.               }
  97.             }
  98.           }
  99.         }
  100.       }
  101.     }
  102.   }
  103. }
  104.  
  105. print "Legfeljebb $opt_max-vel kezdodo 10 jegyu szamok osszessege: ". scalar(keys(%list)) . "\n";
  106.  
  107. my %res = [];
  108. $db = 0;
  109.  
  110. # szorzando $n
  111. foreach my $a (sort(keys(%list)))
  112. {
  113.   # szorzo tenyezo $mul
  114.   # 2es a legkisebb szorzo tenyezo
  115.   # 9esnel nincs ertelme nagyobbanak, mert b = mul * n hosszabb lesz, mint 10 szamjegy.
  116.  
  117.   foreach my $mul (2 .. 9)
  118.   {
  119.     # a szorzat $a * $mul = $b (lasd feladat leirasban 'a' es 'b' szamok)
  120.     my $b = $a * $mul;
  121.    
  122.     # 10 szamjegyunel nagyobb szorzatok kihagyasa
  123.     last if (length($b) != 10);
  124.    
  125.     # nem kulonbozo szamjegyuek kihagyasa
  126.     next unless (haveDifferentNumbers($b));
  127.    
  128.     # eredmeny redundancia-mentes tarolasa
  129.     $res{"$a * $mul = $b"} = '';
  130.    
  131.     # szamlalo novelese
  132.     $db ++;
  133.  
  134.     if ($debug_level > 0)
  135.     {
  136.       print "-->$a * $mul = ".($b)."\n" if $db < 20; # debug miatt jo
  137.       if ($debug_level > 1)
  138.       {
  139.         print "$db\n" if ($db % 1000 == 0);
  140.       }
  141.     }
  142.    
  143.     # ha egy szamot csak egyszer szamolunk bele es nem nezzuk mas tenyezokkel valo szorzatat, akkor a kov. sor uncomment!
  144.     # next;
  145.   }
  146. }
  147.  
  148. # print "ennyi szampart talaltam: $db\n";
  149. print "ennyi szampart talaltam: ". scalar(keys(%res)) . "\n";
  150.  
  151. if ($debug_level > 0)
  152. {
  153.   my $max = 10;
  154.   foreach (sort(keys(%res)))
  155.   {
  156.     print "$_\n";
  157.     last unless (--$max);
  158.   }
  159. }
  160.  
  161. # free memory
  162. %list = undef;
  163. %res = undef;
  164.  
  165. =pod
  166.     Kimenet:
  167.    
  168.     Legfeljebb 4-vel kezdodo 10 jegyu szamok osszessege: 1451521
  169.     ennyi szampart talaltam: 244424
  170. =cut
Advertisement
Add Comment
Please, Sign In to add comment