Կրեդիտային քարտի համարները պահվում են տվյալների բազաներում և թույլ են տալիս միարժեքորեն իդենտիֆիկացնել քարտապանին՝ անկախնիկ գործարքներ ապահովելու համար։ Աշխարհում բազմաթիվ մարդիկ օգտագործում են կրեդիտային քարտեր, և դրանց եզակիությունը ապահովելու համար, սովորաբար, օգտագործվում են բավականաչափ մեծ թվեր։
Օրինակ՝
American Express
քարտերը օգտագործում են 15
, MasterCard
քարտերը՝ 16,
իսկ Visa
քարտերը՝ 13 կամ 16 նիշից բաղկացած համարներ։Փորձե’ք հաշվել, թե քանի՞ հատ իրարից տարբերվող քարտ է հնարավոր թողարկել, եթե օրինակ, օգտագործվում է 15 նիշ։
Հարցին պատասխանելու համար դիտարկենք 1 նիշանոց համարները։ 1 նիշի դեպքում կարող ենք ունենալ ընդհամենը 10 իրարից տարբեր քարտեր (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)։
Երկու նիշի դեպքում կունենաք 100 (10^2) իրարից տարբեր քարտեր (00, 01, 02 …. 99)։
Երեք նիշի դեպքում կարող ենք թողարկել 1000 (10^3) հատ իրարից տարբեր քարտեր (000, 001, 002, …. 999)
4 նիշի դեպքում քարտերի թիվը կլինի 10^4, իսկ
15
նիշի դեպքում իրարից տարբեր քարտերի քանակը կլինի 10^15, կամ 1,000,000,000,000,000 (կվադրիլիոն) հատ, որը շատ անգամներ գերազանցում է աշխարհում ապրող մարդկանց քանակը։ Իրականում կրեդիտային քարտերի համարները կամայական չեն և ենթարկվում են որոշակի կանոնների և օրինաչափության։ Այսպես, բոլոր
American Express
քարտերը սկսվում են 34
կամ 37
թվանշաններով, MasterCard
քարտերը սկսվում են 51
, 52
, 53
, 54
կամ 55
թվերով, Visa
քարտերը սկսվում են 4
-ով և այլն։ Թվանշանները նաև կապված են իրար հետ որոշակի մաթեմատիկական կանոններով կամ հսկիչ արժեքով (checksum): Հսկիչ արժեքը հաշվելու համար շատ հաճախ կիրառվում է Լունայի ալգորիթմը։

Հսկիչ արժեքը նախատեսված է սխալների հայտնաբերման համար, որոնք առաջացել են տվյալների ոչ դիտավորյալ աղավաղման արդյունքում (օրինակ, ձեռքով կրեդիտային քարտի համարի սխալ մուտքագրման ժամանակ): Այն թույլ է տալիս շատ արագ վավերացնել քարտը առանց տվյալների բազային դիմելու (ինչը բավական երկար գործողություն է)։
Լունայի ալգորիթմը ստուգում է քարտերի վավերականությունը հետևյալ կերպ`
- Նախավերջին թվանշանից սկսած ամեն երկրորդ թվանշանը բազմապատկել 2-ով և գումարել ստացված թվերի թվանշանները։
- Մնացած բոլոր թվանշանները (որոնք չեն բազմապատկվել 2-ով) գումարել իրար։
- Առաջին երկու կետում ստացված թվերը գումարել իրար։
- Եթե ստացված թվի վերջին թվանշանը 0 է, ապա քարտը վավեր է, հակառակ դեպքում այն համարվում է անվավեր։
Ալգորիթմը ավելի լավ հասկանալու համար ստուգենք
4003600000000014
համարով Visa
քարտի (Visa
քարտերը սկսում են 4
-ով) վավերականությունը։- Գտնենք նախավերջին թվանշանից սկսած ամեն երկրորդ թվանշանը և բազմապատկենք դրանք 2-ով։
4003600000000014
1*2 + 0*2 + 0*2 + 0*2 + 0*2 + 6*2 + 0*2 + 4*2 = 2 + 0 +0 +0 +
12
+ 0 + 8
- Գումարենք ստացված թվերի թվանշանները (ոչ թե թվերը, այլ թվանշանները)՝
2 + 0 + 0 +0 +
1 + 2
+ 0 + 8 =
13
- Մնացած բոլոր թվանշանները (որոնք չեն բազմապատկվել 2-ով) գումարենք իրար
4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 7
- Առաջին երկու կետում ստացված թվերը գումարել իրար
13 + 7 =
20
- Ստացած թվի վերջին թվանշանը հավասար է 0, ուստի քարտը վավեր է։
Դե ինչ, ժամանակն է գրել ծրագիր, որ մուտքում ստանում է կրեդիտային քարտի համար և կիրառելով Լունայի ալգորիթմը ստուգում է դրա վավերականությունը։ Եթե քարտը վավեր է, ծրագիրը պետք է տպի քարտի տեսակը։
AMEX
, եթե համարը սկսվում է34
կամ37
-ով, և թվանշանների քանակը հավասար է15
:
MASTERCARD
, եթե համարը սկսվում է51
,52
,53
,54
կամ55
-ով, և թվանշանների քանակը հավասար է16
։
VISA
, եթե համարը սկսվում է4
-ով, և թվանշանների քանակը հավասար է13
կամ16
։
- Եթե քարտը վալիդ չէ, ծրագիրը պետք է տպի “INVALID”տողը։

#include <iostream> int main() { /* Մեծ թվեր պահելու համար օգտագործվում է long int տիպը։ */ long int input; std::cin >> input; std::cout << "Number: " << input<< std::endl; // Put your code here }
Ծրագրավորման ոճ
Խնդիրը գրելուց առաջ, ևս մեկ անգամ կարդացեք «Ծրագրավորման ոճ» դասը։ Մի՛ գրեք ամբողջ ծրագիրը մեկ main ֆունկցիայի մեջ։ Մտածեք, թե ինչ տրամաբանական հատվածների (ֆունկցիաների) է կարելի բաժանել ծրագիրը, որպեսզի կոդը լինի հնարավորինս ընթեռնելի։ Ֆունկցիաներ գրելիս փորձեք պահպանել «եզակի պատասխանատվության» (single responsibility) սկզբունքը։ Օգտագործե՛ք մտածված և իմաստային անուններ և՛ փոփոխականների և՛ ֆունկցիաների համար։