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