Viitenumeron laskenta

Jari_Kettunen 06.01.06 18:19

731-modulon laskeminen erilaisiin numerojonoihin kuten laskujen viitenumerot ja viivakoodit.

 Tekstiversio  Arvo: 0 (2 ääntä)  Äänestä: +  -
  private string laskeviite(string s)
    {
      int i = s.Length;
      int kerroin = 7;
      int summa = 0;
     
      while (i > 0)
      {
        char c = s[i-1];
        summa += kerroin * (c - 48);
        switch (kerroin)
        {
          case 7: kerroin = 3; break;
          case 3: kerroin = 1; break;
          case 1: kerroin = 7; break;

        }
        summa %= 10;
        i -= 1;
      }
      summa = 10 - summa;
      if (summa!=10)
        return s + summa.ToString();
      else
        return s + "0";
    }

feenix 09:56 11.1.06 
Muuten ok, mutta itse en pidä tyylistä ottaa i:hin pituus ja sitten aina indeksoida i-1:llä, miksei ota suoraan yhtä pienempää ja sitten indeksoi i:llä sekä vertailu i >= 0? Tai sitten c = s[--i] jolloin hoidetaan vähennys suoraan eikä vasta lopussa.

Myöskin modulo on turha laskea jokaisessa kierroksessa, vasta lopussa.

(Näin pienelle laskennalle tietysti ovat aika pikkujuttuja, mutta pienistä puroista...)
editoitu: 18:49 11.1.06
Ztane 11:07 11.1.06 
feenix kirjoitti:
Myöskin modulo on turha laskea jokaisessa kierroksessa, vasta lopussa.
Aijjai, vaan eipä olekaan! Jos tulee ylivuoto ni tsädääm, 2^32 ei olekaan jaollinen 10:llä...

EDIT: itseasiassa, laittasin vielä "summa = (10 - summa) % 10 niin ei tarvis tota iffiä.
feenix 15:42 31.5.06 
Ztane kirjoitti:
feenix kirjoitti:
Myöskin modulo on turha laskea jokaisessa kierroksessa, vasta lopussa.
Aijjai, vaan eipä olekaan! Jos tulee ylivuoto ni tsädääm, 2^32 ei olekaan jaollinen 10:llä...


Viitenumerossa voi olla 19 numeroa ennen tarkistusnumeroa, vaikka jokaisen kerroin olisi 7, saataisi silloinkin maksimiksi 1197, joka on aika helposti hoideltavissa jopa 16-bittisillä luvuilla. Ja kun otetaan huomioon että kerroin vaihtelee, suurin mahdollinen summa on pikaisesti laskettuna 657.