Kertoman laskeminen

Matti.W

Taskulaskimet tulostavat kertoman (kts. wikipedia) usein pelkästään lukuun 69 asti, koska tuloksessa ei voi olla enempää kuin 99 nollaa. Äärevät luvut ovat siis laskimille pulma, mutta ongelman voi kiertää kun avuksi ottaa ohjelman jossa luku on purettu alkutekijöihinsä eli mantissaan ja exponenttiin. Mantissa tarkoittaa luvun ensimmäisiä desimaaleja, exponentti sitä kuinka monta kertaa se pitää kertoa kymmenellä.

Em. idea c-kielellä toteutettuna näyttää tältä:

//kertoma.c: kertoma suuresta luvusta iteraatiomenetelmällä toteutettuna.
#include
double purku(double ,long int * e);//paluuarvot: mantissa(float) ja exponentti(int*)
struct liuku { //desimaalilukuja alkutekijöissään
double m; //koko 8 tavua
unsigned long int e; //koko 4 tavua
}x,y;

int main(int argc, char *argv[]) //luetaan luku komentoriviltä
{
int b=atoi(argv[1]); //muutetaan luku merkkijonosta kokonaisluvuksi
if (argc!=2){return 1;} //virhetilanteen hallinta
double a=1;
x.m=1;x.e=0; //kertoman siemenluku
for(a=1;a=10){
x.m=x.m/10;
x.e ;
}
}
a--;
printf("Luvun %g kertoma on %8.7g E%u\n",a,x.m,x.e);
return 0;
}

double purku(double a, long int * pe) //puretaan desimaaliluku alkutekijöihinsä
{
long int e=0;
if(a>1){
while(a>1){a=a/10;e ;}
}
if(a

3

2385

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Edellä mainittu ohjelma laskee kertoman vain likimäärin mutta tämä laskee sen absoluuttisen tarkasti. Ohjelma perustuu binäärikoodattuun desimaalilukuun (bdc) jolla kierretään muutujan kokorajoitukset. Se miten suuresta luvusta voi kertoman ottaa riippuu taulukkomuuttujan ak[] koosta kun koko on 1000 alkiota voidaan ottaa kertoma luvusta 470.

      //kertoma3.c: Absoluuttisen tarkka kertoman laskenta äärevästä luvusta.
      #include
      char ak[1000]={0}; //bdc_luku (kokonaisluku)

      void kertoma(int n);
      void kerto(int n); //bdc_kertolasku
      void tulostus(void); //

      int main()
      {
      int n=470;
      kertoma(n);
      printf("%i! = ",n);tulostus();printf("\n");
      return 0;
      }

      void kertoma(int n)
      {
      int i=1;
      ak[999]=1; //kertoman siemenluku
      for(i=1;i=0;i--){
      yli=(ak[i]*n yli)/10;
      ak[i]=(ak[i]*n m)%10;
      m=yli;
      }
      }

      void tulostus()
      {
      int i=0,j=0, rp=0;
      for(i=0;i

      • koodiApina

        code.c: In function 'main':

        code.c:11: error: parameter 'n' is initialized

        code.c:12: error: expected declaration specifiers before 'kertoma'

        code.c:13: error: expected declaration specifiers before 'printf'

        code.c:13: error: expected declaration specifiers before 'tulostus'

        code.c:13: error: expected declaration specifiers before 'printf'

        code.c:14: error: expected declaration specifiers before 'return'

        code.c:18: error: parameter 'i' is initialized

        code.c:19: error: expected declaration specifiers before 'ak'

        code.c:20: error: expected declaration specifiers before 'for'

        code.c:20: error: expected declaration specifiers before 'i'

        code.c:20: error: expected declaration specifiers before 'i'

        code.c:18: error: declaration for parameter 'i' but no such parameter

        code.c:16: error: declaration for parameter 'kertoma' but no such parameter

        code.c:11: error: declaration for parameter 'n' but no such parameter


    • GMP-fani

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

    Luetuimmat keskustelut

    1. Kansalla on oikeus tietää miksi persut pettävät

      Koko kulunut hallituskausi on kysytty persuilta, minkä vuoksi he ovat pettäneet käytännössä jokaisen vaalilupauksen, ain
      Maailman menoa
      59
      7474
    2. Venäjän armeijan evp-upseeri: Armeija surkeassa tilassa, jonka läpäisee kaiken kattava

      valehtelu. Venäläiset alkaneet pohtia julkisesti maan todellisia tappioita. Z-bloggari ja 3. luokan kapteeni (evp.) Mak
      Maailman menoa
      123
      2906
    3. Minkälaisen viestin

      Laittaisit ikävöinnin kohteelle, jos rohkenisit?
      Ikävä
      142
      1746
    4. Kansalla on oikeus tietää mikä on SDP:n talousohjelma jolla maan talous

      saadaan nousuun? Miksi puolue piilottelee sitä, vai eikö sitä ole? Tähän asti olemme vaan saaneet kuulla hallituksen ha
      Maailman menoa
      65
      1639
    5. Ammattiliitto 900 euroa/vuosi - Työttömyyskassa 72 euroa/vuosi

      Ammattiliitosta eroamalla voi säästää jopa 800 euroa vuodessa. Mitä enemmän tienaat, sitä enemmän maksat liitolle. Esim
      Maailman menoa
      115
      1448
    6. Miten voit olla niin tyhmä

      että et tajunnut että sua vedätettiin? Tietäisitpä miten hyvät naurut on saatu. Naiselle
      Tunteet
      167
      1384
    7. Missä vaiheessa

      Päätit irl luovuttaa minun suhteeni?
      Ikävä
      129
      1116
    8. Millaisena uskot

      Kaivattusi kokevan tunteensa?
      Ikävä
      73
      817
    9. Kyriake=Kirkko

      Kirkko, Kyriake Kirkko-sana tulee kreikankielen sanasta Kyriake=Herran omat, Kristuksen omaksi kastettujen suuri joukko
      Kaste
      47
      802
    10. Mitä haluat eniten

      Kaivattusi kanssa?
      Ikävä
      51
      707
    Aihe