Luhn算法
用于验证信用卡号
- 从最右边的数字,即校验位,向左移动,每秒数字的值加倍;如果该倍增操作的乘积大于9(例如,8×2 = 16),则将乘积的数字相加(例如,16:1 + 6 = 7,18:1 + 8 = 9)或者减去产品中的9(例如,16:16-9 = 7,18:18-9 = 9)。
- 取所有数字的总和。
- 如果总模数10等于0(如果总数以零结束)则该数字根据Luhn公式有效;否则它无效。
醇>
实施
#include<stdlib.h>
#include<stdio.h>
#include<stddef.h>
int luhnSum(int);
typedef struct{
int quotient;
int remainder;
}Tuple;
Tuple* split(int number){
/* Split positive number into all but its last digit and its last digit */
Tuple *tuple = malloc(sizeof(Tuple));
tuple->quotient = number / 10;
tuple->remainder = number % 10;
return tuple;
}
int sumDigits(int number){
/* Return the sum of digits of positive number n */
Tuple *tuple = NULL;
if(number < 10){
return number;
}else{
tuple = split(number);
return sumDigits(tuple->quotient) + tuple->remainder;
}
}
int luhnSumDouble(int number){
Tuple *tuple = split(number);
int luhnDigit = sumDigits(2*(tuple->remainder));
if(number < 10){
return luhnDigit;
}else{
return luhnSum(tuple->quotient + luhnDigit);
}
}
int luhnSum(int number){
Tuple *tuple = NULL;
if(number < 10){
return number;
}else{
tuple = split(number);
return luhnSumDouble(tuple->quotient) + tuple->remainder;
}
}
int main(void){
}
如何分析空间和空间相互递归代码的时间复杂度?