🟡 Խնդիր 4 - Կրեդիտային քարտ

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

#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) սկզբունքը։ Օգտագործե՛ք մտածված և իմաստային անուններ և՛ փոփոխականների և՛ ֆունկցիաների համար։
 

Constraints

Time limit: 0.2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue