【发布时间】: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 的来源。