// PAN的校验位算法是采用计算模10"隔位倍加"校验数的Luhn公式:
// 1. 从右边第1数字开始(低序)每隔1位乘以2;
// 2. 把步骤1中获得的乘积的各位数字与原号码中未乘2的各位数字相加;
// 3. 求这个总和的个位数字的"10的补数", 这个补数就是校验数字.
// 账号共19位,根据前18位算第19位
// 例如: 带入参数:无校验数字的帐号 6224219601000004994
步骤:6 2 2 4 2 1 9 6 0 1 0 0 0 0 0 4 9 9 4
*2 *2 *2 *2 *2 *2 *2 *2 *2 *2// 步骤 6 2 2 4 2 1 9 6 0 1 0 0 0 0 0 4 9 9 4
1: *2 *2 *2 *2 *2 *2 *2 *2 *2 *2
// -------------------------
// 2: 12 4 4 18 0 0 0 0 18 8// 3: 1+2+2+4+4+4+1+1+8+6+0+1+0+0+0+0+0+4+1+8+9+8=64
// 4: 4的补数=6
// 结果: 带有校验数字的帐号为
// 62242196010000049946C#写出这段算法,请大家帮帮忙
// 1. 从右边第1数字开始(低序)每隔1位乘以2;
// 2. 把步骤1中获得的乘积的各位数字与原号码中未乘2的各位数字相加;
// 3. 求这个总和的个位数字的"10的补数", 这个补数就是校验数字.
// 账号共19位,根据前18位算第19位
// 例如: 带入参数:无校验数字的帐号 6224219601000004994
步骤:6 2 2 4 2 1 9 6 0 1 0 0 0 0 0 4 9 9 4
*2 *2 *2 *2 *2 *2 *2 *2 *2 *2// 步骤 6 2 2 4 2 1 9 6 0 1 0 0 0 0 0 4 9 9 4
1: *2 *2 *2 *2 *2 *2 *2 *2 *2 *2
// -------------------------
// 2: 12 4 4 18 0 0 0 0 18 8// 3: 1+2+2+4+4+4+1+1+8+6+0+1+0+0+0+0+0+4+1+8+9+8=64
// 4: 4的补数=6
// 结果: 带有校验数字的帐号为
// 62242196010000049946C#写出这段算法,请大家帮帮忙
解决方案 »
- google baidu 搜索框输入字符 就弹出提示!数据怎么处理?
- IIS 浏览页面出现“/Web”应用程序中的服务器错误”。
- 使用存储过程插入数据后怎么获取受影响的行数
- XtraGrid的自动计算列怎么设置?
- 关于WebBrowser控件的问题
- C# image类问题,急!!
- button的click事件能不能穿参数
- 问关于水晶报表打印数据库记录的问题
- 怎样看代码。。。
- 能通过类修改applicationname.exe.config吗?
- C#中Interface和泛型一起使用后,有一个问题,因为本人不了解Interface和泛型,自己写了一个实例来测试,现在遇到难题了。
- 复制文件进度条显示
static void Main(string[] args)
{
string pan = "6224219601000004994";
List<int> pans = new List<int>();
int sum = 0;
for (int i = pan.Length; i > 0; i--)
{
if (i%2 !=0)
{
int a = (Convert.ToInt32(pan.Substring(i - 1, 1))*2);
if (a>10)
{
pans.Add(1);
}
pans.Add(a%10);
}
else
{
pans.Add(Convert.ToInt32(pan.Substring(i - 1, 1)));
}
}
foreach (int item in pans)
{
sum += item;
}
Console.WriteLine("总和:"+sum); //这里一下没另外定义变量,图省事。
Console.WriteLine("个位数:"+sum % 10);
Console.WriteLine("补数:" + (10 - sum % 10));
Console.WriteLine("结果:" + pan + (10 - sum % 10).ToString()); Console.Read();
}
private string CheckPan(string str)
{
if (str.Length != 19)
{
return string.Empty;
} string result = str;
bool isOdd = true;
int sum = 0;
foreach (char c in str)
{
int n = c - 48; ;
if (n < 0 || n > 9)
{
return string.Empty;
} if (isOdd)
{
n *= 2;
n = n % 10 + n / 10;
}
sum += n;
isOdd = !isOdd;
} sum %= 10;
sum = 10 - sum; return result + sum.ToString();
}
if (n < 0 || n > 9)
{
return string.Empty;
}能解释下着的意思吗?没看明白?
就是把字符变成对应的整数,因为0的Acsii码是48,所以用字符的Ascii码减48就是对应的整数了如果这个值小于0或者大于9,就表示这个字符不是数字,比如给的字符串不全是数字的时候,就会返回string.empty