• 第十届 蓝桥杯样题 —— 信用卡号验证


    【编程大题】信用卡号验证

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

    【程序测试参考用例】

       356406010024817     成功
    
      358973017867744     成功
    
      356827027232781     失败
    
      306406010024817     失败
    
      358973017867754     失败
    

    代码

    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <string>
    using namespace std;
    string ll2s(long long &num,string &str)
    {
    	stringstream ss;
    	ss<<num;
    	ss>>str;
    }
    int main()
    {
    	string num;
    	cin>>num;
    	while(1)
    	{
    		int len=num.length();
    		int ji=0,ou=0,number[20];
    		memset(number,0,sizeof(number));
    		for(int i=0;i<len;i++)
    			number[i]=num[i]-'0';
    		for(int i=0;i<len;i++)
    		{
    			if((i+1)%2!=0)
    	  		    ji+=number[len-i-1];
    			if((i+1)%2==0)
    			{
    				int x=2*number[len-i-1];
    				if(x>9) x-=9;
    				ou+=x;
    			}
    		}
    		if((ji+ou)%10==0) cout<<"成功"<<endl;
    		else cout<<"失败"<<endl;
    		cin>>num;
    	}
    	return 0;
    }
    
  • 相关阅读:
    常见的MYSQL高可用解决方案
    CDN——到底用还是不用?
    Maven学习总结
    Git – Fast Forward 和 no fast foward
    Spring boot 打成jar包问题总结
    Spring Data JPA进阶——Specifications和Querydsl
    Arp攻击实战
    crontab命令
    mtr命令
    如何使用qperf来衡量网络带宽和延迟性能?
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12338659.html
Copyright © 2020-2023  润新知