信用程序无法编译

标签 c cs50 luhn

我尝试编写一个 C 程序来检查银行卡是否有效。

根据 Luhn 算法,您可以确定信用卡号(在语法上)是否有效,如下所示:

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

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

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

这有点令人困惑,所以让我们以我的 AmEx 为例:378282246310005。

为了便于讨论,我们首先从倒数第二个数字开始,在每隔一个数字下划线:

378282246310005

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

7•2 + 2•2 + 2•2 + 4•2 + 3•2 + 0•2 + 0•2

这给了我们:

14 + 4 + 4 + 8 + 6 + 0 + 0

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

1 + 4 + 4 + 4 + 8 + 6 + 0 + 0 = 27

现在让我们将总和 (27) 添加到未乘以 2 的数字之和:

27 + 3 + 8 + 8 + 2 + 6 + 1 + 0 + 5 = 60

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

因此,验证信用卡号并不难,但手动验证确实有点乏味

#include <cs50.h>
#include <math.h>
#include <stdio.h>

int length(long long n);
int num_at(int x,long long y);
long long flip(double a);

int main(void)
{
    //int total2=0;
    //printf("Number: ");
    //int i=get_int();
    long long ll=get_long_long();
    //if (ll<=0)
    //{
    //    printf("INVALID\n");
    //}
    //for (int i=1;2*i<length(ll);i++)
    //{
    //    total2=total2+2*num_at(i,ll);
    //}
    //int total1=0;
//for (int i=0;2*i<length(ll);i++)
//{
//    total1=total1+num_at(i,ll);
//}
//int total=total1+total2;
//printf("%i\n",total);
printf("%lli\n",flip(ll));
}

int length(long long n)/* length of number */
{
    long long x=1;
    int len=0;
    while(n-n%x!=0)/* x % y means x mod y*/
    {
        len++;
        x=x*10;
    }
        return len;
}
int num_at(int x,long long y)/* digit at specific spot in number */
{
    int digit=0;//the digit at position z(see below)
    int z=1;
    for(z=x;z>=0;z--)
    {
        digit=y%10;
        y=y-y%10;
        y=y/10;
    }
    return digit;
}
long long flip(double a)//flips a
{
    long long b=0;
    for(int y=0;y<length(a);y++)
    {
        b=b*10;
        b=b+(a%pow(10.0,y+1)-a%pow(10.0,y))/pow(10.0,y);
    }
    return b;
}

编译时的错误是:

credit.c:99:15: error: invalid operands to binary expression ('double' and 'double')
    b=b+(a%pow(10.0,y+1)-a%pow(10.0,y))/pow(10.0,y);
         ~^~~~~~~~~~~~~~
credit.c:99:31: error: invalid operands to binary expression ('double' and 'double')
    b=b+(a%pow(10.0,y+1)-a%pow(10.0,y))/pow(10.0,y);
                         ~^~~~~~~~~~~~

最佳答案

您无法对 double (或 float )执行模运算。 原因很简单,余数仅针对整数算术定义。 2.3 除以 0.4 余数是多少?

因此,要做你想做的事,你需要将 double ( a 和 pow 的结果)强制转换为 long long 。

所以你可以这样做 ((long long) a) % (long long) pow( ... ) 应该没问题。

以后您应该查看错误消息(以及警告)。

这里清楚地说明了二进制表达式的无效操作数,并标记了 % 运算符。

关于信用程序无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43060364/

相关文章:

java - Luhn公式在Java中的实现

java - 使用 Luhn 算法检查信用卡有效性

c - 用 C 语言编写一个程序,应用 Luhn 算法进行信用卡验证

c - fork() 函数在这个程序中是如何工作的?

c - 在打印出首字母的 C 程序中不理解的行为

c - 将行存储到动态结构中

c - 我的代码上下文中的 UndefinedBehaviorSanitizer 是什么

sql - Pset7 - 电影卡在 12 和 13 SQL 上?

c - 合并文件与在 C 中 append 文件

java - Tizen Mobile 和 iPad Linux - 它是否允许 GCC 和 Java?