Ondalık gösterimin tekrarını bulun!


12

Gelen bu meydan 2 yıl önce, bulduğumuz dönemini bir birim fraksiyonu ( 1/n where n is a natural number).

Şimdi, göreviniz bir birim kesirinin tekrarını bulmak için bir program / işlev yazmaktır .

Repetend gibi sonsuz tekrarlar ondalık genişleme parçasıdır:

  • Ondalık ifadesi 1/6DİR 0.16666...ardından repetend olduğunu 6.
  • Ondalık ifadesi 1/11DİR 0.090909...ardından repetend olduğunu 09.
  • Ondalık ifadesi 1/28DİR 0.0357142857142857142857...ardından repetend olduğunu 571428.

gözlük

  • Herhangi bir makul biçimde girin.
  • Tekrarlama değerini ondalık, dize veya listede çıktı olarak alır .
  • İçin 1/7( 0.142857142857...), çıkış gerekir 142857yerine 428571.
  • İçin 1/13( 0.076923076923076923...), çıkış gerekir 076923yerine 76923.
  • Kaba kuvvet yok, lütfen.

testcases

Input    Output
1        0
2        0
3        3
7        142857
13       076923
17       0588235294117647
28       571428
70       142857
98       102040816326530612244897959183673469387755
9899     000101020305081321345590463683200323264976260228305889483786241034447924032730578846348115971310233356904737852308313971108192746742095161127386604707546216789574704515607637135064147893726639054449944438832205273259925244974239822204263056874431760783917567431053641781998181634508536215779371653702394181230427315890493989291847661379937367410849580765733912516415799575714718658450348520052530558642287099707041115264168097787655318719062531568845337912920497019901

puanlama

Bu . Bayt kazanmada en kısa çözüm.

Hiçbir cevap kabul edilmez, çünkü amaç en kısa çözümü üretebilecek dili değil, her dilde en kısa çözümü bulmaktır.

Liderler Sıralaması



1
13 tekrarının 769230 değil 076923 olduğuna nasıl karar veriyorsunuz?
aditsu bıraktı çünkü SE EVIL

@aditsu Çünkü 1/13olduğunu 0.076923076923...değil0.769230769230...
Çatlak Rahibe

3
Açıkça hiçbir zaman bir cevabı asla kabul etmeyeceğinizi belirtmek, bunu bir katalog yapar. Sadece bir şey söyleme ve bir cevap kabul etme.
Dennis

1
Her dil için en kısa çözümü göstermek üzere bir yığın snippet'i ekleyebilirsiniz.
aditsu bıraktı çünkü SE EVIL

Yanıtlar:


5

Java, 150 bayt:

String p(int n){int a=1,p;String r="";for(;n%10<1;n/=10);for(;n%2<1;n/=2)a*=5;for(;n%5<1;n/=5)a*=2;for(p=a%=n;;){p*=10;r+=p/n;if(a==(p%=n))return r;}}

Eklenen boşluk:

String p(int n){
    int a=1,p;
    String r="";
    for(;n%10<1;n/=10);
    for(;n%2<1;n/=2)
        a*=5;
    for(;n%5<1;n/=5)
        a*=2;
    for(p=a%=n;;){
        p*=10;
        r+=p/n;
        if(a==(p%=n))
            return r;
    }
}

Ungolfed, tam program:

import java.util.Scanner;

public class A036275 {
    public static String period(int a,int n){
        if(n%10==0) return period(a,n/10);
        if(n%2==0) return period(a*5,n/2);
        if(n%5==0) return period(a*2,n/5);
        a %= n;
        int pow = a;
        String period = "";
        while(true){
            pow *= 10;
            period += pow/n;
            pow %= n;
            if(pow == a){
                return period;
            }
        }
    }
    public static String period(int n){
        return period(1,n);
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        System.out.println(period(n));
    }
}

for(;;)while(2<3)sonsuz bir döngü olmasına rağmen daha az bayt olurdu ! (ve while(1)@Maltysen'den daha az bayt )
Marv

@Marv Bunu nasıl unutmuş olabilirim? Teşekkürler!
Sızan Rahibe

Döngüler için ave için bildirimler koyun r. Bayt kaydeder!
CalculatorFeline

1
@CatsAreFluffy Onları erişilemez kılar ...
Leaky Nun

3

CJam, 26

riL{_XW$%A*:X|X@-}g_X#>\f/

Çevrimiçi deneyin

Açıklama:

Program, daha önce gördüğü bir temettü bulana kadar ondalık genişlemenin hesaplanmasında yer alan bir dizi temettü oluşturur. Daha sonra, bununla başlayan tüm temettüleri alır ve tekrarın rakamlarını almak için n'ye böler.

ri       read the input and convert to integer (n)
L        push an empty array (will add the dividends to it)
{…}g     do … while
  _      copy the current array of dividends
  X      push the latest dividend (initially 1 by default)
  W$     copy n from the bottom of the stack
  %A*    calculate X mod n and multiply by 10
  :X     store in X (this is the next dividend)
  |      perform set union with the array of dividends
  X@     push X and bring the old array to the top
  -      set difference; it is empty iff the old array already contained X
          this becomes the do-while loop condition
_X#      duplicate the array of dividends and find the position of X
>        take all dividends from that position
\f/      swap the array with n and divide all dividends by n


2

Jöle , 12 10 bayt

%³×⁵
1ÇÐḶ:

@ Aditsu'nun CJam cevabından aldığım bir fikir olan temettüleri takip ederek 2 bayt kazandım .

Çevrimiçi deneyin!

Nasıl çalışır

%³×⁵     Helper link. Argument: d (dividend)

%³       Yield the remainder of the division of d by n.
  ×⁵     Multiply by 10.


1ÇÐḶ:    Main link. Argument: n

1        Yield 1 (initial dividend).
 ÇÐḶ     Apply the helper link until its results are no longer unique.
         Yield the loop, i.e., everything from the first repeated result
         up to and including the last unique one.
    :    Divide each dividend by n.

1

GameMaker Dili, 152 bayt

Kenny'nin cevabına dayanarak

n=argument0;a=1r=0while(n mod 2<1){a*=5n/=2}while(n mod 5<1){a*=2n/=5}a=a mod n;p=a;while(1){p*=10r=r*10+p/n;r=r mod $5f5e107;p=p mod n;if(a=p)return r}

Yaklaşımımda bir hata buldum ve düzelttim, belki de bunu da güncellemeniz gerekir.
Sızan Rahibe


1

Perl 6 , 37 bayt

{(1.FatRat/$_).base-repeating[1]||~0}
~0 max (1.FatRat/*).base-repeating[1]

Sadece 64 bit tam sayıya uyan paydalarla çalışacağını umursamıyorsanız, yöntem çağrısını kaldırabilirsiniz .FatRat.

Açıklama:

# return 「"0"」 if 「.base-repeating」 would return 「""」
~0

# 「&infix<max>」 returns the numerically largest value
# or it's first value if they are numerically equal
max

(
  # turn 1 into a FatRat so it will work
  # with denominators of arbitrary size
  1.FatRat

  # divided by
  /

  # the input
  *

# get the second value from calling the
# method 「.base-repeating」
).base-repeating[1]

Ölçek:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &code = ~0 max (1.FatRat/*).base-repeating[1];
# stupid highlighter */
# Perl has never had // or /* */ comments

my @tests = (
  1    => '0',
  2    => '0',
  3    => '3',
  6    => '6',
  7    => '142857',
  11   => '09',
  13   => '076923',
  17   => '0588235294117647',
  28   => '571428',
  70   => '142857',
  98   => '102040816326530612244897959183673469387755',
  9899 => '000101020305081321345590463683200323264976260228305889483786241034447924032730578846348115971310233356904737852308313971108192746742095161127386604707546216789574704515607637135064147893726639054449944438832205273259925244974239822204263056874431760783917567431053641781998181634508536215779371653702394181230427315890493989291847661379937367410849580765733912516415799575714718658450348520052530558642287099707041115264168097787655318719062531568845337912920497019901',
);

plan +@tests;

for @tests -> $_ ( :key($input), :value($expected) ) {
  is code($input), $expected, "1/$input";
}
1..12
ok 1 - 1/1
ok 2 - 1/2
ok 3 - 1/3
ok 4 - 1/6
ok 5 - 1/7
ok 6 - 1/11
ok 7 - 1/13
ok 8 - 1/17
ok 9 - 1/28
ok 10 - 1/70
ok 11 - 1/98
ok 12 - 1/9899


0

PHP, 169 Bayt

$d=$argv[2];$a[]=$n=$argv[1];while($n%$d&&!$t){$n*=10;$r[]=$n/$d^0;$t=in_array($n%=$d,$a);$a[]=$n;}if($t)echo join(array_slice($r,array_search(end($a),$a),count($a)-1));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.