Last active
August 29, 2015 14:15
-
-
Save alikrc/cbfe966f4b086f5430b3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <summary> | |
/// 11 haneli bir rakamdır. | |
/// 0'la başlayamaz. | |
/// ilk 10 rakamın toplamının birler basamağı, son rakama eşittir | |
/// | |
/// Vikipedi: | |
/// 1, 3, 5, 7 ve 9. rakamın toplamının 7 katı ile 2, 4, 6 ve 8. rakamın toplamının 9 katının toplamının birler basamağı 10. rakamı; | |
/// 1, 3, 5, 7 ve 9. rakamın toplamının 8 katının birler basamağı 11. rakamı vermektedir. | |
/// | |
/// Programatik olarak düşünürsek, ilk rakam 0. index olduğuna göre: | |
/// 0, 2, 4, 6, 8. rakamın(çift haneler 10 hariç) toplamının 7 katı ile 1, 3, 5, 7.(tek haneler 9 ve 11 hariç) toplamının 9 katının toplamının birler basamağı(mod10) sondan bir önceki rakama eşittir | |
/// 0, 2, 4, 6, 8. rakamın toplamının 8 katının birler basamağı(mod10) son rakama eşittir | |
/// </summary> | |
public static bool IsTcValid(string tcNo) | |
{ | |
Int64 tc = 0; | |
bool isNumber = Int64.TryParse(tcNo, out tc); | |
bool hasElevenChar = tcNo.Length == 11; | |
bool isNotStartWithZero = tcNo.StartsWith("0") == false; | |
// şartlar sağlanmıyorsa devam etme | |
if (isNumber == false || hasElevenChar == false || isNotStartWithZero == false) | |
{ | |
return false; | |
} | |
bool isValid = false; | |
#region compute sums | |
var first10NumberSum = 0; | |
var evenNumbersSum = 0; | |
var oddNumbersSum = 0; | |
for (int i = 0; i < tcNo.Length; i++) | |
{ | |
int n = (int)Char.GetNumericValue(tcNo[i]); // değerini al | |
var isLastNo = i == 10; | |
if (!isLastNo) | |
{ | |
first10NumberSum += n; | |
} | |
var isEven = i % 2 == 0; | |
if (isEven && i <= 8) // i = 0,2,4,6,8 | |
{ | |
evenNumbersSum += n; | |
} | |
var isOdd = i % 2 != 0; | |
if (isOdd && i < 8) // i = 1,3,5,7 | |
{ | |
oddNumbersSum += n; | |
} | |
} | |
#endregion | |
var numberBeforeLastNumber = (int)Char.GetNumericValue(tcNo[9]); | |
var lastNumber = (int)Char.GetNumericValue(tcNo[10]); | |
// ilk 10 rakamın toplamının birler basamağı, son rakama eşittir | |
bool isFirst10NumberSumEqualLastNumber = ((first10NumberSum % 10) == lastNumber); | |
// ( çift haneler * 7 + tek haneler * 9 ) mod 10 = sondan bir önceki | |
bool isRuleTrue = ((evenNumbersSum * 7 + oddNumbersSum * 9) % 10) == numberBeforeLastNumber; | |
// çift haneler toplamının 8 katının birler basamağı(mod10) son rakama eşittir | |
bool isEvenRuleTrue = (evenNumbersSum * 8) % 10 == lastNumber; | |
// extra | |
bool rule = (evenNumbersSum * 7 - oddNumbersSum) % 10 == numberBeforeLastNumber; | |
bool isLastNumberEven = lastNumber % 2 == 0; | |
if (isFirst10NumberSumEqualLastNumber && isEvenRuleTrue && isRuleTrue && rule && isLastNumberEven) | |
{ | |
isValid = true; | |
} | |
return isValid; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment