【问题标题】:I couldn't understand why my function does not work我不明白为什么我的功能不起作用
【发布时间】:2020-04-17 19:21:17
【问题描述】:

所以这应该可以满足 Luhn 算法对 Harward cs50 pset1 的需求。但它有一些我找不到的流量。通常while循环的条件不是计算8次,但在测试它时我想:首先我应该解决函数工作中的流程。想不起来的人,Luhn 算法的作用如下:

从数字的倒数第二个数字开始,每隔一个数字乘以 2,然后将这些产品的数字相加。

将总和与未乘以 2 的数字的总和相加。

如果总数的最后一位为 0(或者更正式地说,如果总数模 10 等于 0),则该数字有效!

这就是示例输入:

这有点令人困惑,所以让我们以大卫的签证为例:4003600000000014。

为了讨论,

让我们先在每个数字下划线,

从号码的倒数第二个数字开始:

4003600000000014

好的,让我们将带下划线的每个数字乘以 2:

1•2 + 0•2 + 0•2 + 0•2 + 0•2 + 6•2 + 0•2 + 4•2

这给了我们:2 + 0 + 0 + 0 + 0 + 12 + 0 + 8

现在让我们将这些产品的数字(即不是产品本身)加在一起:

2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13

现在让我们将总和 (13) 添加到未乘以 2 的数字的总和(从末尾开始):13 + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20

是的,总和 (20) 的最后一位数字是 0,所以大卫的卡是合法的!

这是我的职责。

bool checkdigits(long long x)
{   int power();
    int checklength();
    long counter,sum,summ2,multp2,index;
    sum=0;
    summ2=0;
    index=1;
    counter=0;
while(!(counter == 8))
    {
    sum+=x/power(10,index)%10;
    multp2=(x/power(10,index))%10*2;
    if(multp2 >= 10)
    {summ2 += (multp2 % 10)+1;}
    else if(multp2 < 10)
    {summ2 += multp2 % 10;}
    index = index+2;
    counter++;
    }


if((sum + summ2)%10 == 0)
{return true;}
else
{return false;}
}

【问题讨论】:

  • 只需使用一串数字即可。这样一来,您就不会通过弄乱模数和功率来提取它们。事实上,您必须使用字符串,否则您无法知道输入了多少个前导零。
  • 我会检查字符串,但你能告诉我(如果你能找到的话)我的逻辑有什么问题吗? @WeatherVane
  • 如果power 使用浮点运算,则可能是inaccuracy 的来源。

标签: c cs50 luhn


【解决方案1】:

正如 Weather Vane 指出的那样,使用字符串更容易:

bool checkdigits(const char* number)
{
    long long sum1 = 0, sum2 = 0;

    for (int i = strlen(number) - 1; i >= 0; i -= 2) // single add every second
        sum1 += number[i] - '0';
    for (int i = strlen(number) - 2; i >= 0; i -= 2) // double add every other second
        sum2 += 2 * (number[i] - '0') - ((number[i] - '0') > 4 ? 9 : 0);
                                       // number > 4 => 2 * number > 10
                                       // therefore subtract 9

    return (sum1 + sum2) % 10 == 0;
}

我不知道cs50,但这应该可以。

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多