C编程Luhn算法
C programming Luhn algorithm
我曾尝试用 C 编写一个程序来检查信用卡的 Luhn 算法,但它不起作用。我想我不太清楚 getchar()
是如何工作的,但这个程序对我来说看起来很合理。你能告诉我它有什么问题吗?在此先感谢您的帮助。
#include <stdio.h>
int main(void) {
char x;
int n, sum, i, c;
sum = 0;
printf("Insert the number of digits: ");
scanf("%d",&n);
printf("Insert the digits: ");
for(i = n; i > 1; i = i - 1){
x = getchar();
if(i%2==0)
if(2*x < 10) sum = sum + 2*x;
else sum = sum + 2*x - 9;
else sum = sum + x;
i = i - 1;
}
c = (9*sum)%10;
x = getchar();
getchar();
if(x == c) printf("Last digit: %d,\nCheck digit: %d,\nMatching",x,c);
else printf("Last digit: %d,\nCheck digit: %d,\nNot Matching",x,c);
}
getchar()
读取一个 字符。所以,循环中的x = getchar();
不好,因为
- 如果您在第一个“位数”之后输入换行符,它首先读取一个换行符。
- 它将读取一个字符,而不是一个整数。字符代码通常与字符代表的整数不同,它可能会影响校验位的计算。
而不是x = getchar();
,你应该在循环中这样做:
scanf(" %c", &x); /* ignore whitespace characters (including newline character) and read one character */
x -= '0'; /* convert the character to corresponding integer */
#include <stdio.h>
#define N 16
void luhn_algorithm();
int main(){
int a[N];
int i;
printf("type the card number:\n");
for(i=1;i<=N;i++){
scanf("%d",&a[i]);
}
luhn_algorithm(a);
}
void luhn_algorithm(int *a){
int i,multiply=1,m,sum=0,total=0;
for(i=1;i<=N;i++){
if(i%2!=0){
multiply=a[i]*2;
if(multiply>9){
while(multiply>0){
m=multiply%10;
sum+=multiply;
multiply/=10;
}
multiply=sum;
}
}
else if(i%2==0){
multiply=a[i]*1;
if(multiply>9){
while(multiply>0){
m=multiply%10;
sum+=multiply;
multiply/=10;
}
multiply=sum;
}
}
total+=multiply;
}
if(total%10==0){
printf("\nthis credit card is valid ");
}
else{
printf("\nthis credit card is not valid");
}
}
这是我用来检查信用卡号码是否有效的程序,试试这个。
我将数字放在一个数组中,然后根据它们的位置将其相乘,如果相加总数的最后一位数字为 0,则将它们全部相加,这意味着该卡有效,否则无效。
看看有什么问题请告诉我
我曾尝试用 C 编写一个程序来检查信用卡的 Luhn 算法,但它不起作用。我想我不太清楚 getchar()
是如何工作的,但这个程序对我来说看起来很合理。你能告诉我它有什么问题吗?在此先感谢您的帮助。
#include <stdio.h>
int main(void) {
char x;
int n, sum, i, c;
sum = 0;
printf("Insert the number of digits: ");
scanf("%d",&n);
printf("Insert the digits: ");
for(i = n; i > 1; i = i - 1){
x = getchar();
if(i%2==0)
if(2*x < 10) sum = sum + 2*x;
else sum = sum + 2*x - 9;
else sum = sum + x;
i = i - 1;
}
c = (9*sum)%10;
x = getchar();
getchar();
if(x == c) printf("Last digit: %d,\nCheck digit: %d,\nMatching",x,c);
else printf("Last digit: %d,\nCheck digit: %d,\nNot Matching",x,c);
}
getchar()
读取一个 字符。所以,循环中的x = getchar();
不好,因为
- 如果您在第一个“位数”之后输入换行符,它首先读取一个换行符。
- 它将读取一个字符,而不是一个整数。字符代码通常与字符代表的整数不同,它可能会影响校验位的计算。
而不是x = getchar();
,你应该在循环中这样做:
scanf(" %c", &x); /* ignore whitespace characters (including newline character) and read one character */
x -= '0'; /* convert the character to corresponding integer */
#include <stdio.h>
#define N 16
void luhn_algorithm();
int main(){
int a[N];
int i;
printf("type the card number:\n");
for(i=1;i<=N;i++){
scanf("%d",&a[i]);
}
luhn_algorithm(a);
}
void luhn_algorithm(int *a){
int i,multiply=1,m,sum=0,total=0;
for(i=1;i<=N;i++){
if(i%2!=0){
multiply=a[i]*2;
if(multiply>9){
while(multiply>0){
m=multiply%10;
sum+=multiply;
multiply/=10;
}
multiply=sum;
}
}
else if(i%2==0){
multiply=a[i]*1;
if(multiply>9){
while(multiply>0){
m=multiply%10;
sum+=multiply;
multiply/=10;
}
multiply=sum;
}
}
total+=multiply;
}
if(total%10==0){
printf("\nthis credit card is valid ");
}
else{
printf("\nthis credit card is not valid");
}
}
这是我用来检查信用卡号码是否有效的程序,试试这个。 我将数字放在一个数组中,然后根据它们的位置将其相乘,如果相加总数的最后一位数字为 0,则将它们全部相加,这意味着该卡有效,否则无效。 看看有什么问题请告诉我