| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Viitenumeron laskentaJari_Kettunen 06.01.06 18:19 731-modulon laskeminen erilaisiin numerojonoihin kuten laskujen viitenumerot ja viivakoodit.
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: Aijjai, vaan eipä olekaan! Jos tulee ylivuoto ni tsädääm, 2^32 ei olekaan jaollinen 10:llä...Myöskin modulo on turha laskea jokaisessa kierroksessa, vasta lopussa. EDIT: itseasiassa, laittasin vielä "summa = (10 - summa) % 10 niin ei tarvis tota iffiä. feenix 15:42 31.5.06 Ztane kirjoitti: feenix kirjoitti: Aijjai, vaan eipä olekaan! Jos tulee ylivuoto ni tsädääm, 2^32 ei olekaan jaollinen 10:llä...Myöskin modulo on turha laskea jokaisessa kierroksessa, vasta lopussa. 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. |
![]() Haku
|