Alkulukuja

Tekisi mieli kirjoittaa koodi, joka laskee alkulukuja. Onnsituuko excelillä?
Apuja vinkkejä kiitos!
61375
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Onnistuu millä tahansa ohjelmointikielellä.

Ei ole Exceliä eikä Visual Basiccia tässä, mutta C:n sukuisten kielten syntaksilla kahden luvun suurimman yhteisen tekijän saisi sievennettyä näinkin siistiksi:

while (tmp = i1 % i2) { i1 = i2; i2 = tmp; }
return i2;

Ja tässä sitten i1 pitää olla suurempi kuin i2. Jos i2 on 1, kyseessä on alkuluku. Jos C kielen syntaksi ei ole tuttu niin % on jakojäännös operaattori.

En yleensä ala mitään neuvomaan toisilla kielillä mitä kysytään mutta tämä on sen verran yksinkertainen juttu, että tuosta varmaan tajuaa vaikka olisikin vieras syntaksi.

Äänestä
  • Ihan näppärä tapa selvittää kahden luvun pienin jaettava. Mutta kun sitä ei kysytty vaan kysyttiin alkuluvuista. Ja koodin sievennys ei tarkoita että yhdelle riville tungetaan useampi käsky.

    Kysyjä varmaankin on tekemässä ohjelmaa koulun tehtävänä, jolloin olisi parempi itse funtsia asiaa. Mutta minä nyt malliksi väsäsin sen Visual Basic 2008:lla.

    Seuraava funktio selvittää onko kyseessä alkuluku. Luku jaetaan pienemmillä luvuilla kunnes löytyy pienin yhteinen jaettava.

    Function OnkoAlkuluku(ByVal Nro As Integer)
    Dim i As Integer
    For i = 2 To Nro - 1
       If (Nro Mod i) = 0 Then
          'jakojäännös on nolla joten ei alkuluku
          Return i'palautetaan pienin jaettava   
       End If
    Next
    'on alkuluku, palautetaan 0
    Return 0
    End Function



    'varsinainen ohjelmakoodi tarkastaa 1000 ensimmäistä lukua
    'ja ilmoittaa alkuluvut TextBox1-tekstikentässä (multiline=true)
    Dim Nro As Integer
    Dim PieninJaettava As Integer
    Dim Enter = Chr(13) Chr(10) 'rivinsiirto tekstissä

    Me.TextBox1.Text = ""
    For Nro = 1 To 1000
       PieninJaettava = OnkoAlkuluku(Nro)
       If PieninJaettava = 0 Then
          Me.TextBox1.Text = Nro & " on alkuluku" & Enter
       Else
          'ei ole alkuluku
       End If
    Next

    Äänestä

  • Petri_Petri kirjoitti:

    Ihan näppärä tapa selvittää kahden luvun pienin jaettava. Mutta kun sitä ei kysytty vaan kysyttiin alkuluvuista. Ja koodin sievennys ei tarkoita että yhdelle riville tungetaan useampi käsky.

    Kysyjä varmaankin on tekemässä ohjelmaa koulun tehtävänä, jolloin olisi parempi itse funtsia asiaa. Mutta minä nyt malliksi väsäsin sen Visual Basic 2008:lla.

    Seuraava funktio selvittää onko kyseessä alkuluku. Luku jaetaan pienemmillä luvuilla kunnes löytyy pienin yhteinen jaettava.

    Function OnkoAlkuluku(ByVal Nro As Integer)
    Dim i As Integer
    For i = 2 To Nro - 1
       If (Nro Mod i) = 0 Then
          'jakojäännös on nolla joten ei alkuluku
          Return i'palautetaan pienin jaettava   
       End If
    Next
    'on alkuluku, palautetaan 0
    Return 0
    End Function



    'varsinainen ohjelmakoodi tarkastaa 1000 ensimmäistä lukua
    'ja ilmoittaa alkuluvut TextBox1-tekstikentässä (multiline=true)
    Dim Nro As Integer
    Dim PieninJaettava As Integer
    Dim Enter = Chr(13) Chr(10) 'rivinsiirto tekstissä

    Me.TextBox1.Text = ""
    For Nro = 1 To 1000
       PieninJaettava = OnkoAlkuluku(Nro)
       If PieninJaettava = 0 Then
          Me.TextBox1.Text = Nro & " on alkuluku" & Enter
       Else
          'ei ole alkuluku
       End If
    Next

    ihan hyvä jos kysyjä itse funtsisikin asiaa, tuo Petri_Petrin ehdotus ei ehkä ihan tehokkaimmasta päästä ole: esim. tutkii onko jaollinen 'pienemmillä luvuilla' For i = 2 To Nro - 1 - riittäisikö jokin pienempi yläraja jne ...

    Äänestä

  • puu puu pukari kirjoitti:

    ihan hyvä jos kysyjä itse funtsisikin asiaa, tuo Petri_Petrin ehdotus ei ehkä ihan tehokkaimmasta päästä ole: esim. tutkii onko jaollinen 'pienemmillä luvuilla' For i = 2 To Nro - 1 - riittäisikö jokin pienempi yläraja jne ...

    No joo. Nopeasti väsäsin eikä tullut mieleen. Tosin vain alkulukujen kanssa käydään turhaan loppupuolisko läpi.

    Tietysti homma nopeutuisi vielä paljon enemmän jos edelliset alkuluvut pantaisiin taulukkoon ja tarkastetaan vain ne.

    Nyt (vasta) hain kuuklella ja se (tietysti) löysi valmista koodia. Esim. Eratosthenes:in seula http://users.tkk.fi/~t106216/luennot/kalvot11_02_2004.html

    Äänestä


Yksi idea, mikä taitaa olla juuri tuo E:n seula on seuraavankaltainen: 1. Tee n-mittainen taulukko, joka alustetaan arvoihin true (tai 1, miten vaan). 2. Lähde liikkeelle kohdasta 2 ja merkitse joka toinen taulukon alkio tuon 2:n jälkeen falseksi (tai nollaksi). Siis ensimmäinen nollattu on 4, sitten 6 jne. 3. Tee sama juttu joka kolmannelle lähtien kohdasta 3 3=6. 4. Sama juttu joka neljännelle lähtien kohdasta 4 4=8. 5. jne. Neliöjuuri n:n kohdalla tulosta kaikki indeksit, jotka ovat vielä true-arvoisia. Tätä voi vielä optimoida sillä tavalla, että jos vaikka kohta 4 oli jo false, niin sen yli ei tarvise luupata.

Äänestä

Ketjusta on poistettu 1 sääntöjenvastainen viesti.

Kommentoi aloitusta


excelillä kirjoitti:

Tekisi mieli kirjoittaa koodi, joka laskee alkulukuja. Onnsituuko excelillä?
Apuja vinkkejä kiitos!

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu