Я пытаюсь кодировать проблему кредита для CS50, и она работает для большинства номеров, но когда я запускаю проверку, я получаю сообщение об ошибке, в котором говорится, что мой код возвращает Mastercard для 5555 5555 5555 4444, и он должен быть недействительным , Выясняя это вручную, я не понимаю, почему эта карта будет недействительной. Каждую секунду удваивается di git: 10 (1) + 10 (1) + 10 (1) + 10 (1) + 10 (1) + 10 (1) + 8 + 8 = 22. Затем 22 + 5 + 5 + 5 + 5 + 5 + 5 + 4 + 4 = 50. 50 кратно 10, а число 16 цифр и начинается с 55, так почему же это не Mastercard?
Я смущен опубликовать свой код, потому что я знаю, что это очень громоздко и есть определенно более быстрые, более элегантные способы сделать то же самое, но это мой первый опыт программирования, поэтому мне пришлось делать это единственным способом, который казался мне логичным - и я знаю только сценарии, которые были показаны в классе.
В любом случае, вот оно, пожалуйста, не смейтесь, лол!
// To determine if a user's credit card number is valid and which company it belongs to
#include <cs50.h>
#include <stdio.h>
int main(void)
{
// To get user input of credit card number
long card;
do
{
card = get_long("What is your credit card number: ");
}
while (card < 0);
// To divide number into digits
int a = card % 10;
int b = card % 100 - a;
int bb = b / 10;
int c = card % 1000 - b - a;
int cc = c / 100;
int d = card % 10000 - c - b - a;
int dd = d / 1000;
int e = card % 100000 - d - c - b - a;
int ee = e / 10000;
int f = card % 1000000 - e - d - c - b - a;
int ff = f / 100000;
int g = card % 10000000 - f - e - d - c - b - a;
int gg = g / 1000000;
int h = card % 100000000 - g - f - e - d - c - b - a;
int hh = h / 10000000;
int i = card % 1000000000 - h - g - f - e - d - c - b - a;
int ii = i / 100000000;
int j = card % 10000000000 - i - h - g - f - e - d - c - b - a;
int jj = j / 1000000000;
int k = card % 100000000000 - j - i - h - g - f - e - d - c - b - a;
int kk = k / 10000000000;
int l = card % 1000000000000 - k - j - i - h - g - f - e - d - c - b - a;
int ll = l / 100000000000;
int m = card % 10000000000000 - l - k - j - i - h - g - f - e - d - c - b - a;
int mm = m / 1000000000000;
int n = card % 100000000000000 - m - l - k - j - i - h - g - f - e - d - c - b - a;
int nn = n / 10000000000000;
int o = card % 1000000000000000 - n - m - l - k - j - i - h - g - f - e - d - c - b - a;
int oo = o / 100000000000000;
int p = card % 10000000000000000 - o - n - m - l - k - j - i - h - g - f - e - d - c - b - a;
int pp = p / 1000000000000000;
// To multiply each digit and reduce to one digit
int aaa = a * 2;
if (aaa > 9)
{
int ab = aaa % 10;
int ac = aaa % 100 - ab;
int ad = ac / 10;
aaa = ad + ab;
}
int bbb = bb * 2;
if (bbb > 9)
{
int ba = bbb % 10;
int bc = bbb % 100 - ba;
int bd = bc / 10;
bbb = bd + ba;
}
int ccc = cc * 2;
if (ccc > 9)
{
int cb = ccc % 10;
int ca = ccc % 100 - cb;
int cd = ca / 10;
ccc = cd + cb;
}
int ddd = dd * 2;
if (ddd > 9)
{
int db = ddd % 10;
int dc = ddd % 100 - db;
int da = dc / 10;
ddd = da + db;
}
int eee = ee * 2;
if (eee > 9)
{
int eb = eee % 10;
int ec = eee % 100 - eb;
int ed = ec / 10;
eee = ed + eb;
}
int fff = ff * 2;
if (fff > 9)
{
int fb = fff % 10;
int fc = fff % 100 - fb;
int fd = fc / 10;
fff = fd + fb;
}
int ggg = gg * 2;
if (ggg > 9)
{
int gb = ggg % 10;
int gc = ggg % 100 - gb;
int gd = gc / 10;
ggg = gd + gb;
}
int hhh = hh * 2;
if (hhh > 9)
{
int hb = hhh % 10;
int hc = hhh % 100 - hb;
int hd = hc / 10;
hhh = hd + hb;
}
int iii = ii * 2;
if (iii > 9)
{
int ib = iii % 10;
int ic = iii % 100 - ib;
int id = ic / 10;
iii = id + ib;
}
int jjj = jj * 2;
if (jjj > 9)
{
int jb = jjj % 10;
int jc = jjj % 100 - jb;
int jd = jc / 10;
jjj = jd + jb;
}
int kkk = kk * 2;
if (kkk > 9)
{
int kb = kkk % 10;
int kc = kkk % 100 - kb;
int kd = kc / 10;
kkk = kd + kb;
}
int lll = ll * 2;
if (lll > 9)
{
int lb = lll % 10;
int lc = lll % 100 - lb;
int ld = lc / 10;
lll = ld + lb;
}
int mmm = mm * 2;
if (mmm > 9)
{
int mb = mmm % 10;
int mc = mmm % 100 - mb;
int md = mc / 10;
mmm = md + mb;
}
int nnn = nn * 2;
if (nnn > 9)
{
int nb = nnn % 10;
int nc = nnn % 100 - nb;
int nd = nc / 10;
nnn = nd + nb;
}
int ooo = oo * 2;
if (ooo > 9)
{
int ob = ooo % 10;
int oc = ooo % 100 - ob;
int od = oc / 10;
ooo = od + ob;
}
int ppp = pp * 2;
if (ppp > 9)
{
int pb = ppp % 10;
int pc = ppp % 100 - pb;
int pd = pc / 10;
ppp = pd + pb;
}
// To determine if card is valid
int pra = bbb + ddd + fff + hhh + jjj + lll + nnn + ppp;
int prb = pra + aaa + ccc + eee + ggg + iii + kkk + mmm + ooo;
// To determine if card is AMEX
if (card >= 370000000000000 && card < 380000000000000)
{
printf("AMEX\n");
}
else if (card >= 340000000000000 && card < 350000000000000)
{
printf("AMEX\n");
}
// To determine if card is MASTERCARD
else if (card >= 5100000000000000 && card < 5500000000000000)
{
printf("MASTERCARD\n");
}
// To determine if card is VISA
else if (card >= 4000000000000 && card < 5000000000000)
{
printf("VISA\n");
}
else if (card >= 4000000000000000 && card < 5000000000000000)
{
printf("VISA\n");
}
// To determine if card is INVALID
else
{
printf("INVALID\n");
}
}