试图实现一个luhn算法,但使用一个间隔字符串作为输入。我试过Linq,一些预定义的字符串函数可能与它直接相关(Trim((,Replace(((,但它没有打印出正确的答案
这是我的代码:
static bool checkCard(string cardNo)
{
int[] cardInt = new int[cardNo.Length];
for(int i = 0;i < cardNo.Length; i++){
cardInt[i] = (int)(cardNo[i]);
}
for(int i = cardNo.Length - 2;i >= 0;i-=2){
int temporaryValue = cardInt[i];
temporaryValue*=2;
if(temporaryValue > 9){
temporaryValue = temporaryValue % 10 +1;
}
cardInt[i] = temporaryValue;
}
int sum = 0;
for(int i = 0;i<cardNo.Length;i++){
sum+=cardInt[i];
}
if(sum % 10 == 0){
return true;
}
return false;
}
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
string card = Console.ReadLine();
if (checkCard(card))
Console.WriteLine("YES");
else
Console.WriteLine("NO");
}
}
输入:4556 7375 8689 9855
输出必须是"0";"是";但它打印出";否";相反我可以编辑什么来消除这个错误?
在您的情况下,我不明白为什么不能只使用char。IsDigit((认为信用卡号不是字母数字这里有一个简短的linq示例:
var digitsOnly = cardNo.Where(x => char.IsDigit(x)).ToArray();
int[] integersArray = digitsOnly.Select( x = int.Parse(x.ToString())).ToArray();
顺便说一句,如果你把char转换成int,你会得到它的ASCII int值,所以0是48,1是49等等。
这个问题的正确答案是由@Rafalon 提出的
在读取的每个字符串之后添加替换(","(函数