将Python代码翻译成C的挑战:实现用于校验和计算的Luhn算法

问题描述 投票:0回答:1

我目前正在致力于用 C 语言实现 Luhn 算法以进行校验和计算。然而,我的 C 代码遇到了一个问题,它始终产生不正确的输出(给出 11 而不是预期的 29)。对此感到沮丧,我决定用 Python 重写算法,令人惊讶的是,它在短短 2 分钟内就完美地运行了。我现在很困惑是什么导致了 C 和 Python 实现之间的差异。有人可以帮忙检查我的 C 代码并帮助确定根本问题吗?下面是两种实现方式的比较:

#python code
x = 4003600000000014

def checkSum(n):
    sm = 0
    swm = 0
    j = 10
    k = 100
    l = 100
    m = 1000
    for i in range(0, len(str(n)) // 2):
        sm += (((n % k) - (n % j)) // j)*2
        j *= 100
        k *= 100
    swm += n % 10
    for i in range(0, len(str(n)) // 2):
        swm += ((n % m) - (n % l)) // l
        l *= 100
        m *= 100
    return sm+swm

print(checkSum(x))

//c code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int checkSum(long n);
int longLength(long n);

int main(void)
{
    long long number = 4003600000000014;
    printf("%d\n", longLength(number));
    return 0;
}

int longLength(long n)
{
    int length = 0;
    while (n > 0)
    {
        n = n/10;
        length++;
    }
    return length;
}

int checkSum(long n)
{
    int sm = 0;
    int swm = 0;
    int j = 10;
    int k = 100;
    int l = 100;
    int m = 1000;

    for(int i=0;i<longLength(n)/2;i++)
    {
        sm += (((n % k)-(n % j))/j)*2;
        j *= 100;
        k *= 100;
    }
    swm+= n % 10;
    for(int i=0 ;i<longLength(n)/2;i++)
    {
        swm +=(((n % m)-(n % l))/l);
        l *= 100;
        m *= 100;
    }
    return sm + swm;
}

python c algorithm long-integer luhn
1个回答
0
投票

long
数字可能比
long long
更窄。

在声明和定义中使用更广泛的参数,以免丢失信息。

// int longLength(long n);
int longLength(long long n);
// int checkSum(long n);
int checkSum(long long n);


// int longLength(long n)
int longLength(long long n)
  ...

// int checkSum(long n) 
int checkSum(long long n)
  ...

节省时间并启用所有编译器警告以接收类似内容

© www.soinside.com 2019 - 2024. All rights reserved.