使用C#写了一个可以推算火车票身份证号码的小程序
1.火车票上*号打的是月,日,理论上的有最大366种组合;
2.校验码是最后的一位,0-9及X,11个结果;
3.那么,通过火车票上的身份证号,可以得到33个左右真正的有效身份证号;
4.如果你能知道对方的星座(嗯,大家不是经常曝自己是什么星座么),那么,再将这30多个结果映射到12个星座中,最终可能性只有2-3个。。。
5.结论:晒车票,一定要打码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceGeyunfei.CheckID
{
classProgram
{
staticint[]a=newint[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
staticchar[]b=newchar[]{'1','0','X','9','8','7','6','5','4','3','2'};
staticintindex=0;
staticvoidMain(string[]args)
{
System.Console.WriteLine("输入火车票上的身份证号:");
Stringa=System.Console.ReadLine();
varyear=int.Parse(a.Substring(6,4));
varbeginDate=newDateTime(year,1,1);
varchk=a.Substring(14);
intdays=365;
if(DateTime.IsLeapYear(year))
days++;
for(inti=0;i<days;i++)
{
varchkDate=beginDate.AddDays(i).ToString("MMdd");
varid=a.Substring(0,10)+chkDate+chk;
CheckID(id);
}
}
privatestaticvoidCheckID(stringid)
{
intsum=0;
for(inti=0;i<17;i++)
{
sum+=int.Parse(id[i].ToString())*a[i];
}
varchk=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);
}
}
privatestaticStringgetAstro(intmonth,intday)
{
String[]starArr={"魔羯座","水瓶座","双鱼座","牡羊座",
"金牛座","双子座","巨蟹座","狮子座","处女座","天秤座","天蝎座","射手座"};
int[]DayArr={22,20,19,21,21,21,22,23,23,23,23,22};//两个星座分割日
intindex=month;
//所查询日期在分割日之前,索引-1,否则不变
if(day<DayArr[month-1])
{
index=index-1;
}
index=index%12;
//返回索引指向的星座string
returnstarArr[index];
}
}
}