CS50抵免额:如果有其他情况,如何更改这些条件

时间:2019-02-23 06:20:48

标签: c cs50

我想使用其他条件进行判断,但没有用。我想这是因为/保留了整个部分。因此,我想知道:我是否需要更改整个机制(如果有其他条件),或者我可以用C中的任何内容替换/

谢谢!

美国运通使用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使用以4开头的13位和16位数字

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

1 个答案:

答案 0 :(得分:0)

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