Skip to content

Instantly share code, notes, and snippets.

@alikrc
Last active August 29, 2015 14:15
Show Gist options
  • Save alikrc/cbfe966f4b086f5430b3 to your computer and use it in GitHub Desktop.
Save alikrc/cbfe966f4b086f5430b3 to your computer and use it in GitHub Desktop.
/// <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