原帖地址:http://www.devdiv.com/forum.php?mod=viewthread&tid=104289&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1
通过Luhn算法校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数、偶数位(用红色标出)分布:5432123456788881
奇数位和=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70 可以被10整除,认定校验通过。
请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过返回值显示:"成功"(1),否则显示"失败"(0)。
比如,用户输入:356827027232780
程序输出:成功
- //将一个字符串倒置
- void reverse(char * str)
- {
- int i;
- char ch;
- for(i=0;i<(int)strlen(str)/2;i++){
- ch=*(str+i);
- *(str+i)=*(str+strlen(str)-i-1);
- *(str+strlen(str)-i-1)=ch;
- }
- }
- //校验卡号是否合法
- int examine(char* numbers)
- {
- int i;
- int sum_even=0;//偶数和
- int sum_odd=0;//奇数和
- reverse(numbers);
- for(i=0;i<(int)strlen(numbers);i++){
- if(i%2==0){//因为小标从0开始
- sum_odd+=numbers[i]-'0';
- }else{
- sum_even+=(numbers[i]-'0')*2>9?((numbers[i]-'0')*2-9):(numbers[i]-'0')*2;
- }
- }
- return !((sum_even+sum_odd)%10);
- }
复制代码
objective-c里可以通过(char *)[string UTF8string]这么传进参数。