Кредит CS50: как изменить эти условия - PullRequest
0 голосов
/ 23 февраля 2019

Я хотел использовать те или иные условия для вынесения суждения, но это не сработало.Я полагаю, это потому, что / сохраняет всю часть.Поэтому мне было интересно, что: мне нужно изменить весь этот механизм (если есть условия) или просто есть что-то в CI, которое можно использовать для замены /?

Спасибо!

AmericanExpress использует 15-значные номера, начиная с 34 или 37

if (answer / pow(10,13) == 34 | answer / pow(10,13) == 37 )
   {
       printf("AMEX\n");
   }

MasterCard использует 16-значные номера, начиная с 51, 52, 53, 54 или 55

else if (answer / pow(10,14) == 51 | answer / pow(10,14) == 52 | answer / pow(10,14) == 53| answer / pow(10,14) == 54 )
   {
       printf("MASTERCARD\n");
   }

Visaиспользует 13- и 16-значные числа, начиная с 4

else if (answer / pow(10,12) == 4 | (answer / pow(10,15) )== 4) 
   {
       printf("VISA\n");
   }

1 Ответ

0 голосов
/ 23 февраля 2019
double pow(double, double)

pow делает все арифметическое переключение с целых чисел на удвоение.

Простейший пример, иллюстрирующий вашу проблему:

1 / (double)10 == 0.01

- ложь из-за ошибок округления.Никогда не проводите == сравнений с использованием типов с плавающей запятой.

Я предлагаю вам перейти от двойных к целым числам, чтобы сделать ваши сравнения точными, например:

unsigned long long answer = ...;
if (answer / 10000000000000ull == 34 | answer / 10000000000000ull == 37 )
... and so on ...

Или лучше, я предлагаювы переходите к строкам, так как я не вижу смысла в выполнении арифметических операций над номером карты как целым числом.Или лучше перейти к массиву цифр.

const char answer[16];
scanf("%15s", answer);
if (strlen(answer) == 15 && answer[0] == '3' && (answer[1] == '4' || answer[1] == '7')) 
...
else if (strlen(asnwer) == 16 && answer[0] == '5' && ('1' <= answer[1] && answer[1] <= '4'))
 ... and so on
...