信用卡号验证 用c++如何解决?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信用卡号验证 用c++如何解决?相关的知识,希望对你有一定的参考价值。
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过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整除,认定校验通过。
请编写一个程序,从标准输入获得卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。
比如,用户输入:356827027232780
程序输出:成功
我只会C++,C一点不懂.如能改为C++,本人感激不尽!最好注释详细一点!我是菜鸟
#include <cstdlib>
#include <iostream>
#include<string>
using namespace std;
void luhn(string string1)
int sum1=0;//奇数位和
int sum2=0;//偶数位和
for(int i=string1.size()-1;i>=0;i-=2)//suze()读取字符串长度
sum1+=int(string1[i])-48;//string[n] 读取第n位字符,好久没用过string了 记得有个函数是类型转换的 你上网查下吧 我这里没用函数 直接强制转换的
for(int j=string1.size()-2;j>=0;j-=2)
if(2*(int(string1[j])-48)>=10)
sum2=sum2+2*(int(string1[j])-48)-9;
else
sum2=sum2+(int(string1[j])-48)*2;
if((sum1+sum2)%10==0)
cout<<"成功."<<endl;
else
cout<<"失败"<<endl;
int main(int argc, char *argv[])
cout<<"请输入卡号:"<<endl;//题目中两个例子怎么卡号位数不一样啊?
string string1;
cin>>string1;
luhn(string1);
system("PAUSE");
return EXIT_SUCCESS;
参考技术A #include<stdio.h>
#include <string.h>
int ValidCard(char *s )
int nSumOdd,nSumEven,nLen,nCount,nTemp;
char *p;
nLen = strlen(s) ;
nSumOdd = 0,nSumEven=0;
for(p=s+nLen-1,nCount=1;p>=s;p--,nCount++)
if( nCount%2)
nSumOdd = nSumOdd + *p-'0'; //从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加
else //从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
nTemp = (*p-'0')*2;
if(nTemp>9)nTemp = nTemp-9;
nSumEven = nSumEven + nTemp;
if((nSumOdd+ nSumEven)%10) return 0;//将奇数位总和加上偶数位总和,结果应该可以被10整除
else return 1;
main()
char sCard[28];
printf("Intput the cardID:\n");
gets(sCard);
if( ValidCard(sCard) )
printf("成功\n");
else printf("失败\n");
getchar() ;
追问
这是用C做的,我要的是C++,不要糊弄我OK!
追答我晕,有C标准语言,直接到C++中就可以用,相关方法直接转换成C++类的方法就可以了。
追问大哥用C做,百度有现成的答案!我费这尽干啥!
使用正则表达式验证信用卡号
【中文标题】使用正则表达式验证信用卡号【英文标题】:Validating credit card number using regular expression 【发布时间】:2019-02-26 10:53:25 【问题描述】:信用卡号格式为:“nnnn nnnn nnnn nnnn”
我用这个模式测试了下面四个字符串,但是 temp3 字符串意外返回 true。
我不知道怎么了。我正在使用的正则表达式应该准确地验证四位数字和一个空格,但是 temp3 尽管不匹配此模式,但仍返回 true。
String temp1 = " adfs 1111 2222 3333 4444 fadad"; // outer test
String temp2 = "11 11 2222 3333 4444"; // inner test
String temp3 = "11111 2222 3333 4444"; // inner test
String temp4 = "1111 2a222 3333 4444"; // inner test
public String chkContainCardno(String inputstr)
Pattern p = Pattern.compile("[0-9]4\\s[0-9]4\\s[0-9]4\\s[0-9]4");
Matcher m = p.matcher(inputstr);
if (m.find())
return m.group(0);
else
return ErrMsg.Does_Not_Contain_Card_No;
[测试结果]
temp1 : adfs 1111 2222 3333 4444 fadad
: true 1111 2222 3333 4444
temp2:11 11 2222 3333 4444
:假
temp3 : 11111 2222 3333 4444
: true 1111 2222 3333 4444
我不明白
temp4:1111 2a222 3333 4444
:假
【问题讨论】:
第 1 和第 3 是唯一匹配模式的输入以查找 4 组 4 位数字 有一个实际的算法来检查信用卡是否是真实的信用卡号,称为Luhn algorithm 【参考方案1】:第三个测试通过了,因为您的模式周围没有锚点。您应该在任一端添加\b
,即"\\b[0-9]4\\s[0-9]4\\s[0-9]4\\s[0-9]4\\b"
,以强制在单词边界内匹配。
【讨论】:
【参考方案2】:你可以用这个:
"(\\b\\d4\\s\\d4\\s\\d4\\s\\d4\\b)"
b - 单词边界
d - 数字
【讨论】:
以上是关于信用卡号验证 用c++如何解决?的主要内容,如果未能解决你的问题,请参考以下文章