我想检查信用卡号码是否有效,但当我运行代码时,我给予的每个数字作为输入,输出都是无效的。
下面的例子是我应该做的。
以大卫的签证为例:4003600000000014.
为了便于讨论,让我们首先每隔一个数字加下划线,从数字倒数第二个数字开始:
4003600000000014
1.好的,让我们把每个带下划线的数字乘以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
1.现在,让我们将这些产品的数字(即,不是产品本身)加在一起:
2 + 0 + 0 + 0 + 0 + 1 + 2 + 0 + 8 = 13
1.现在让我们把这个和(13)加到没有乘以2的数字的和上(从最后开始):
13 + 4 + 0 + 0 + 0 + 0 + 0 + 3 + 0 = 20
1.,和(20)的最后一位是0,所以大卫的卡是合法的!
#include <stdio.h>
int main()
{
int no;
printf("Visa number: ");`
scanf("%d", &no);
int d_1, d_2, d_3, d_4, d_5, d_6, d_7, d_8, d_9, d_10, d_11, d_12, d_13, d_14, d_15;
d_15 = no%10;
d_14 = ((no%100)/10)*2;
d_13 = (no%1000)/100;
d_12 = ((no%10000)/1000)*2;
d_11 = (no%100000)/10000;
d_10 = ((no%1000000)/100000)*2;
d_9 = (no%10000000)/1000000;
d_8 = ((no%100000000)/10000000)*2;
d_7 = (no%1000000000)/100000000;
d_6 = ((no%10000000000)/1000000000)*2;
d_5 = (no%100000000000)/10000000000;
d_4 = ((no%1000000000000)/100000000000)*2;
d_3 = (no%10000000000000)/1000000000000;
d_2 = ((no%100000000000000)/10000000000000)*2;
d_1 = (no%1000000000000000)/100000000000000;
int d[7] = {d_2, d_4, d_6, d_8, d_10, d_12, d_14};
int n,add;
for (n=1; n<=7; n++)
if(d[n]>10)
{
d[n] = (d[n]%10);
d[(15-n)+1] = ((d[n]%100)/10);
int sum=0;
for (int i=0; i<7; i++)
sum += d[i];
}
else
{
add = d_14 + d_12 + d_10 + d_8 + d_6 + d_4 + d_2;
}
int sum = add + d_15 + d_13 + d_11 + d_9 + d_7 + d_5 + d_3 + d_1;
if ((sum % 10) == 0)
{
printf("%s\n", "The card is valid");
}
else
{
printf("%s\n", "The card is invalid");
}
}
3条答案
按热度按时间mpbci0fu1#
我给予的每一个数字作为输入,输出都是无效的。
太大
OP的
int
可能是32位的。阅读文本输入,试图形成
int
范围外的int
是 * 未定义行为 *。其余代码无关紧要。考虑先将用户输入阅读到 string 中,然后再处理字符。@风向标
rm5edbpk2#
noj0wjuj3#
考虑将用户输入声明为long long数据类型,以便最多存储16位数字。