我目前正在用C语言实现用于校验和计算的Luhn算法.然而,我在C代码中遇到了一个问题,它总是产生不正确的输出(给出11,而不是预期的29).对此感到沮丧的是,我决定用Python语言重写算法,令人惊讶的是,它在短短2分钟内就完美地工作了.我现在很困惑是什么原因导致了C和Python实现之间的差异.谁能帮我判断一下我的C代码,帮我找出潜在的问题?下面是两种实现进行比较:

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))

#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", checkSum(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;
}

推荐答案

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)
  ...

节省时间并启用all个编译器警告以接收类似以下内容:

warning: conversion from 'long long int' to 'long int' may change value [-Wconversion]

这将表明int个变量中的许多变量应该是long long.

// warning: conversion from 'long int' to 'int' may change value [-Wconversion]
sm += (((n % k) - (n % j)) / j) * 2;

Python相关问答推荐

时间序列分解

仿制药的类型铸造

根据另一列中的nan重置值后重新加权Pandas列

如何在Windows上用Python提取名称中带有逗号的文件?

将两只Pandas rame乘以指数

用Python解密Java加密文件

joblib:无法从父目录的另一个子文件夹加载转储模型

计算天数

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

Polars将相同的自定义函数应用于组中的多个列,

Flask Jinja2如果语句总是计算为false&

Pandas:计算中间时间条目的总时间增量

Gekko中基于时间的间隔约束

如何使用matplotlib查看并列直方图

如何用FFT确定频变幅值

PYTHON中的pd.wide_to_long比较慢

PYTHON中的selenium不会打开 chromium URL

查找数据帧的给定列中是否存在特定值

在聚合中使用python-polars时如何计算模式

PYODBC错误(SQL包含-26272个参数标记,但提供了235872个参数,HY 000)