Alkulukuja

excelillä

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

6

1354

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 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.

      • Petri_Petri

        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


      • puu puu pukari
        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 ...


      • Petri_Petri
        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


    • eseula

      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.

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

    Luetuimmat keskustelut

    1. Silmienvääntelijä-persut pääsivät Japanissa sarjakuvaan

      Torille! https://www.hs.fi/kulttuuri/art-2000011943173.html
      Maailman menoa
      179
      5012
    2. Nato kaatamassa Petterin haaveileman Tunnin junan?

      Nato edellyttää pohjoisessa Jäämereltä Rovaniemelle saakka kapearaitesta suoraa rautatieväylää, joka maksaa paperirahaa,
      Maailman menoa
      19
      4397
    3. Donald Trump pääsi samalle listalle Sanna Marinin kanssa

      Eli vasemmistolaisen Time-median top 100 jännäihmisten listalle. https://time.com/collections/time100-next-2021/5937699
      Maailman menoa
      9
      3117
    4. Älkää vaan sairastuko syöpään Suomessa

      Tilaston mukaan Suomi, Slovakia ja Latvia lääkitsee aivan pohjamudissa syöpää. Sairastunutta hoidetaan edelleen vanhana
      Maailman menoa
      253
      2962
    5. Kyllä, maata ei halua puolustaa nimenomaan punavihreän puolen edustajat

      "Esimerkiksi maanpuolustushenki on keskimääräistä alempana naisten, arvoliberaalien, heikossa taloustilanteessa olevien
      Maailman menoa
      143
      2902
    6. Sä veit mun sydämen ihan totaalisesti

      Aivan totaalisesti..
      Ikävä
      52
      2511
    7. Oot se sinä

      Ihan varmasti oot, tuo olemus ei valehtele 😘💓🪅 🏡 ihana 😍🙏
      Ikävä
      27
      1929
    8. Ei siinä kauan

      Menisi jos olisimme kahden
      Ikävä
      22
      1757
    9. Vieläkö olet

      Rakastunut minuun? Minä sinuun
      Ikävä
      35
      1750
    10. Toivotko vielä kohtaamista

      Kaivattusi kanssa?
      Ikävä
      68
      1741
    Aihe