主题:信用卡卡号验证程序——处男贴(by 牛牛大王)
a5863040
[专家分:0] 发布于 2011-05-08 11:13:00
题目:
当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
源程序:
#include "stdio.h"
#include "string.h"
//验证函数
int checkcardnumber(char *cardnum)
{
int i;//循环变量
long o_sum=0; //奇数和
long e_sum=0; //偶数和
long sum=0; //奇数和和偶数和的总和
int pos_num=0; //当前位的数字
//数字汇总
for(i=strlen(cardnum)-1;i<=0;i++)
{
pos_num=cardnum-'0'; //字符转换为数字
//判断奇偶
if((i+1)%2==0)
{
//偶数情况
if(pos_num*2>9)
{
e_sum+=pos_num*2-9;
}
else
{
e_sum+=pos_num*2;
}
}
else
{
//奇数情况
o_sum+=pos_num;
}
}
sum=o_sum+e_sum;
//验证总和是否能整除10
if(sum%10==0)
{
printf("成功\n");
return 1;
}
else
{
printf("失败\n");
return 0;
}
}
void main()
{
char *p;
printf("请输入信用卡号:");
scanf("%s",p);
checkcardnumber(p);
}
回复列表 (共4个回复)
沙发
a5863040 [专家分:0] 发布于 2011-05-08 11:15:00
沙发自己坐!
板凳
fragileeye [专家分:1990] 发布于 2011-05-08 22:58:00
这个算法还真没听过额。 - - !
3 楼
cxxcomp [专家分:2370] 发布于 2011-05-08 23:23:00
几乎是10年前的东西了, 恕我直言,这个代码写的也不是很漂亮. 没什么多大意思. 用C写, 没写出C的什么特点, 比如, 奇偶校验就完全可以用位运算来做,可没有. 我贴段我认为写的更好的代码, 是c++的.
-------------------------------------------------------------------------------
LLUHN.cpp
//////////////////////////////////////////////////////////////////////
//
// Designed by Liutao, Xi'an Jitotong University
// 2001-04-23
//
//////////////////////////////////////////////////////////////////////
//
// LLUHN.cpp: implementation of the LLUHN class.
//
//////////////////////////////////////////////////////////////////////
#include "LLUHN.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LLUHN::LLUHN()
{
m_strCardNum = _T("");
}
LLUHN::LLUHN(CString strCardNum)
{
for (int i=0; i<strCardNum.GetLength(); i++)
if (!isdigit(strCardNum[i]))
{
LLUHN();
return;
}
m_strCardNum = strCardNum;
}
LLUHN::~LLUHN()
{
m_strCardNum = _T("");
}
#define CurrentDigit(i) (m_strCardNum[i]-'0')
BOOL LLUHN::IsValid()
{
int sum = 0;
if (m_strCardNum.IsEmpty()) return false;
for (int i=m_strCardNum.GetLength()-2; i>=0; )
{
sum += CurrentDigit(i)*2>10 ? 1+(CurrentDigit(i)*2)%10 : CurrentDigit(i)*2, i--;
if (i>=0) sum += CurrentDigit(i), i--;
}
return (10-sum%10)==(m_strCardNum[m_strCardNum.GetLength()-1]-'0');
}
char LLUHN::GetCheckSum()
{
int sum = 0;
if (m_strCardNum.IsEmpty()) return false;
for (int i=m_strCardNum.GetLength()-1; i>=0; )
{
sum += CurrentDigit(i)*2>10 ? 1+(CurrentDigit(i)*2)%10 : CurrentDigit(i)*2, i--;
if (i>=0) sum += CurrentDigit(i), i--;
}
return (10-sum%10+'0');
}
#undef CurrentDigit
BOOL LLUHN::SetCardNum(CString strCardNum)
{
for (int i=0; i<strCardNum.GetLength(); i++)
if (!isdigit(strCardNum[i])) return false;
m_strCardNum = strCardNum;
return true;
}
const CString LLUHN::GetCardNum()
{
return m_strCardNum;
}
LLUHN.h
//////////////////////////////////////////////////////////////////////
//
// Designed by Liutao, Xi'an Jitotong University
// 2001-04-23
//
//////////////////////////////////////////////////////////////////////
//
// LLUHN.h: interface for the LLUHN class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_LLUHN_H__6ACE3589_24B6_466C_921F_DCA4CA09AC97__INCLUDED_)
#define AFX_LLUHN_H__6ACE3589_24B6_466C_921F_DCA4CA09AC97__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class LLUHN
{
public:
const CString GetCardNum();
char GetCheckSum();
BOOL IsValid();
BOOL SetCardNum(CString strCardNum);
LLUHN();
LLUHN(CString strCardNum);
virtual ~LLUHN();
private:
CString m_strCardNum;
};
#endif // !defined(AFX_LLUHN_H__6ACE3589_24B6_466C_921F_DCA4CA09AC97__INCLUDED_)
---------------------------------------------------------------------------------
wiki给出了常用的几种语言的版本.
http://en.wikipedia.org/wiki/Luhn_algorithm
4 楼
a5863040 [专家分:0] 发布于 2011-05-09 00:17:00
哈哈!这是我的第一次发帖,高手,请原谅小白哈,这是C语言比赛的一道题啦!以前我也没有听过!
我来回复