回 帖 发 新 帖 刷新版面

主题:信用卡卡号验证程序——处男贴(by 牛牛大王)

题目:
    当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过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个回复)

沙发

沙发自己坐!

板凳

这个算法还真没听过额。 - - !

3 楼

几乎是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 楼

哈哈!这是我的第一次发帖,高手,请原谅小白哈,这是C语言比赛的一道题啦!以前我也没有听过!

我来回复

您尚未登录,请登录后再回复。点此登录或注册