问题 - 在C ++中
信用卡号码检查,信用卡号码的最后一位是校验位,可防止转录错误,例如单个数字错误或切换两位数字。以下方法用于验证实际的信用卡号,但为简单起见,我们将对8位数而不是16位的数字进行描述:
•从最右边的数字开始,形成每个其他数字的总和。例如,如果信用卡号是43589795,那么您形成总和:5 + 7 + 8 + 3 = 23.
•将上一步中未包含的每个数字加倍。添加结果数字的所有数字。例如,使用上面给出的数字,从倒数第二个开始,将数字加倍,得到:18 18 10 8.在这些值中添加所有数字得到:1 + 8 + 1 + 8 + 1 + 0 + 8 = 27。
•添加前两个步骤的总和。如果结果的最后一位为0,则该数字有效。在我们的例子中,23 + 27 = 50,所以这个数字是有效的。
编写一个实现此算法的程序,并打印该数字是否有效。
这就是我目前所拥有的
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int main()
{
int sum_even = 0;
string oddnum;
string oddnum_temp;
cout << "Enter an 8 digit card credit card number: " << endl;
string number;
cin >> number;
int length = number.length();
if (length != 8)
{
cout <<"Invalid credit card number: " <<endl;
}
for (int i = 1; i <= 8; i++)
{
if (i%2 == 0)
{
sum_even = number.substr(i, 1);
}
else
{
for (int j = 1; i <= 8; i++)
{
if (j%2 == 1)
{
oddnum = number.substr(j, 1);
}
}
}
}
for (int i = 1; i <= 8; i++)
{
oddnum_temp = oddnum.substr(i, 8);
}
cout << oddnum_temp << endl;
我的做法是对的吗?我如何向前推进,因为我收到了Core Dumped错误
答案 0 :(得分:1)
索尔,
在担心校验位之前,您需要通过调试器运行代码。您缺少一些基本概念,这是我注意到的事情。
在表面上你的j var永远不会增加。 (对for循环,变量范围和递增进行一些研究)
您正试图在不使用oddnum长度的情况下遍历字符串oddnum,并移动经过字符串所拥有的内存。 (做一些关于字符串操作的研究)
c ++中的字符串和所有其他数组都是基于零的,从1开始计算并始终缺少字符串中的第一个元素。 (阵列访问研究)
您需要记住您将数字存储在字符串中。这意味着您必须获取字符串中的每个元素并将字符的值转换为数字(在c ++中有关于铸造的研究)。
您可能需要更多的东西来清理。但是,您可以通过调试器中的一些断点来最好地捕获错误。
答案 1 :(得分:1)
尝试使用此代码它将与您想要的完全相同
//Credit card no validation
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<conio.h> //for getche()
using namespace std;
int main()
{
int no1=0,od=0,to=0,fi=0;
int j=(-1),ev=0,odd=0;
int i=1;
int max=15;
int x[max];
char ch='a';
string cardno;
cout<<"Enter the 8 digit card no";
do
{
ch=getche();
x[i] = ch-48; //-48 because of ASCII valuse
++i;
++j;
}while(ch != '\r');
if(j!=8)
{
cout<<"\nCredit card is INVALID";
exit(0);
}
cout<<endl;
for(int j=1;j<5;j++)
ev+=x[2*j];
for(int j=0;j<4;j++)
{
od=2*x[(2*j)+1];
no1=od%10+od/10;
odd+=no1;
}
cout<<"Total no of DIGITS in CARD is:"<<j<<endl;
cout<<"Sum of odd digit is "<<ev<<endl;
cout<<"Sum of even digit is "<<odd<<endl;
to=ev+odd;
fi=to%10;
if(fi==0)
{
cout<<"CREDIT CARD IS VALID";
}
if(fi!=0)
{
cout<<"Credit card is INVALID";
}
return 0;
它应该是有帮助的我猜
答案 2 :(得分:0)
在循环中,您将从1到8进行迭代(包括8个)。所以,当你的代码到达时
if (i%2 == 0)
{
sum_even = number.substr(i, 1);
}
它将尝试从字符串边界
中创建一个子字符串答案 3 :(得分:0)
试试这会有所帮助
但该程序是用java语言编写的,所以要理解解决这个问题的方法并在解决方案中使用它
import java.util.Scanner;
public class Creditcard {
public static void main(String[] args) {
int sum = 0;
int sum1 = 0;
System.out.println("Enter 8 digit credit card number :");
Scanner kb = new Scanner(System.in);
String string = kb.nextLine();
for (int i = 0; i < 8; i++) {
if (i % 2 != 0) {
char ch = (string.charAt(i));
int no = ch - 48;
sum = sum + no;
}
if (i % 2 == 0) {
char ch1 = (string.charAt(i));
int no1 = ch1 - 48;
no1 = (2 * no1);
while (no1 != 0) {
int temp1 = no1 % 10;
no1 = no1 / 10;
sum1 = sum1 + temp1;
}
}
}
int result = sum + sum1;
if (result % 10 == 0) {
System.out.println("valid");
} else {
System.out.println("Invalid");
}
}
}