1. 火车票上*号打的是月,日,理论上的有最大366种组合;
2. 校验码是最后的一位,0-9及X,11个结果;
3. 那么,通过火车票上的身份证号,可以得到33个左右真正的有效身份证号;
4. 如果你能知道对方的星座(嗯,大家不是经常曝自己是什么星座么),那么,再将这30多个结果映射到12个星座中,最终可能性只有2-3个。。。
5. 结论:晒车票,一定要打码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Geyunfei.CheckID { class Program { static int[] a = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
static char[] b = new char[] { '1' , '0' , 'X' , '9' , '8' , '7' , '6' , '5' , '4' , '3' , '2' };
static int index = 0; static void Main(string[] args) { System.Console.WriteLine( "输入火车票上的身份证号:" );
String a = System.Console.ReadLine(); var year = int.Parse(a.Substring(6, 4));
var beginDate = new DateTime(year, 1, 1);
var chk = a.Substring(14);
int days = 365; if (DateTime.IsLeapYear(year))
days++; for (int i =0;i<days; i++)
{ var chkDate = beginDate.AddDays(i).ToString( "MMdd" );
var id = a.Substring(0, 10) + chkDate + chk;
CheckID(id); } } private static void CheckID(string id) { int sum = 0; for (int i = 0; i < 17; i++)
{ sum += int.Parse(id[i].ToString()) * a[i]; } var chk = b[sum % 11];
if (chk == id[17])
{ index++; Console.WriteLine(getAstro(int.Parse(id.Substring(10,2)),int.Parse(id.Substring(12,2)))+ index.ToString() + " " +id);
} } private static String getAstro(int month, int day) { String[] starArr = { "魔羯座" , "水瓶座" , "双鱼座" , "牡羊座" ,
"金牛座" , "双子座" , "巨蟹座" , "狮子座" , "处女座" , "天秤座" , "天蝎座" , "射手座" };
int[] DayArr = { 22, 20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22 }; // 两个星座分割日
int index = month; // 所查询日期在分割日之前,索引-1,否则不变 if (day < DayArr[month - 1])
{ index = index - 1; } index = index % 12; // 返回索引指向的星座string return starArr[index];
} } } |