// 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.   

    http://hiker2008.blog.51cto.com/10867/78436
      

  2.   


    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();
            }
      

  3.   


            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();
            }
      

  4.   

    LZ已经把算法描述的很清楚了,就差写代码了,建议lz还是自己完成吧
      

  5.   

     int n = c - 48; ;
                    if (n < 0 || n > 9)
                    {
                        return string.Empty;
                    }能解释下着的意思吗?没看明白?
      

  6.   


    就是把字符变成对应的整数,因为0的Acsii码是48,所以用字符的Ascii码减48就是对应的整数了如果这个值小于0或者大于9,就表示这个字符不是数字,比如给的字符串不全是数字的时候,就会返回string.empty
      

  7.   

    昨天我也想到是不是acsii了,只是我把你这段程序翻译成java的时候有了点小问题,所以一直想不通究竟为什么,谢谢啦,呵呵。又学了种方式