暴力破解练习(一)信用卡号的验证

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,
它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881则,奇数位和=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70 可以被10整除,认定校验通过。
请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。
比如,用户输入:356827027232780
程序输出:成功

【参考测试用例】
356406010024817     成功
358973017867744     成功
356827027232781     失败
306406010024817     失败

358973017867754     失败

#include
#include
using namespace std;
int main()
{
	string s = "358973017867754";
	int sum1 = 0,sum2=0;
	for (int i = s.length()-1; i >= 0;i--)
	{
		//奇数
		int j = i + 1;
		if (j % 2 != 0)
		{
			//字符串转换为整数
			sum1 += s.at(i)-48;   
		}
		else
		{
			int a = 0;
			a = (s.at(i)-48) * 2;
			if (9 < a && a<100)
			{
				a -= 9;
			}
			sum2 += a;
		}
		
	}
	int sum3 = (sum1 + sum2) % 10;
	if (sum3== 0)
	{
		cout << "成功" << endl;
	}
	else
	{
		cout << "失败" << endl;
	}
	return 0;
}
  
sum1 += s.at(i)-48;   
eg:str=1234
    假如str[0]存放的数据类型是字符‘1’,那么减去‘0’就得到一个整形数字1,而不是字符型‘1’, 你还是不懂得话,可以查看C程序设计的最后面的“常用字符与ASCLL代码对照表”。
   字符‘0’的ASCLL值是48,而字符‘1’是49,所以str[0]-'0'相当于49-48=1

你可能感兴趣的:(暴力破解方法,内功)