簡體   English   中英

在這個函數中被零除的算術錯誤如何?

[英]How is there the arithmetic error of a division by zero in this function?

我已經編寫了Luhn 算法的實現 當我使用因位數而無效的數​​字測試程序時,我沒有收到任何程序錯誤。 相反,程序在主函數中執行printf()調用。 但是,每當我按照算法使用有效卡號測試程序時,我都會得到除以 0 的錯誤。 用 DBG 調試給我一個算術錯誤,而 MSVC 給我一個浮點異常,縮小到除以 0。這是代碼:

#include <stdio.h>
#include <math.h>
#include "cs50.h" // For MSVC, I used scanf_s() from stdio.h instead since cs50.h is not supported

long long Prompt(void); // Returns credit card number
int Validate(long long); // Returns checksum
void Report(long long); // Prints success

int main()
{
    long long CardNumber = Prompt();
    int CheckSum = Validate(CardNumber);
    if (!(CheckSum % 10)) {
        Report(CardNumber);
    } else {
        printf("INVALID\n");
    }
    return 0;
}

long long Prompt(void)
{
    printf("CARD NUMBER: ");
    long long CardNumber;
    CardNumber = GetLongLong();
    return CardNumber;
}

int Validate(long long CardNumber)
{
    int CheckSum = 0;
    int Digit = 0;
    int DigitCount = (int)(floor(log10l(CardNumber) + 1));
    for (int i = 2; i < DigitCount; i += 2) {
        Digit = 2 * ((CardNumber % (10 ^ i)) / (10 ^ (i - 1))); // BUG
        if (Digit > 9) {
            int BiDigit = Digit;
            Digit = 0;
            int SubDigit = 0;
            for (int j = 0; j < 2; i++) {
                SubDigit = (BiDigit % (10 ^ j)) / (10 ^ (j - 1)); // BUG
                Digit += SubDigit;
            }
        }
        CheckSum += Digit;
    }
    for (int i = 1; i < DigitCount; i += 2) {
        Digit = (CardNumber % (10 ^ i)) / (10 ^ (i - 1));
        CheckSum += Digit;
    }
    return CheckSum;
}

void Report(long long CardNumber)
{
    int DigitCount = (int)(floor(log10l(CardNumber) + 1));
    int Digit1 = (CardNumber % (10 ^ (DigitCount - 1))) / (10 ^ (DigitCount - 2)); // BUG
    int Digit2 = (CardNumber % (10 ^ (DigitCount - 2))) / (10 ^ (DigitCount - 3)); // BUG
    if (Digit1 == 4 && (DigitCount == 13 || DigitCount == 16))
        printf("VISA\n");
    else if (Digit1 == 3 && (Digit2 == 4 || Digit2 == 7) && DigitCount == 15)
        printf("AMERICAN EXPRESS\n");
    else if (Digit1 == 4 && (Digit2 >= 1 || Digit2 <= 5) && DigitCount == 16)
        printf("MASTERCARD\n");
    else
        printf("INVALID\n");
    return;
}
Digit = 2 * ((CardNumber % (10 ^ i)) / (10 ^ (i - 1)));

^不是冪運算符,而是CC++按位異或。 一旦i達到10 ,表達式10 ^ i就變為零。


順便說一句,為了從整數中獲取數字,最好避免浮點運算( floorlog10l )。 一種可能的算法可能如下所示:

int DigitIndex = 0;
while (CardNumber > 0)
{
    int Digit = CardNumber % 10;
    CardNumber /= 10;

    // calculate check sum depending on parity of DigitIndex

    DigitIndex++;       
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM