fork download
  1. using static System.Console;
  2. using System;
  3.  
  4. (var ok, var digitos) = ValidarCnpj("12345678901234");
  5. if (!ok) WriteLine($"Dígitos finais corretos seriam {digitos}");
  6. (ok, digitos) = ValidarCnpj("12.345.678.9012-34");
  7. if (!ok) WriteLine($"Dígitos finais corretos seriam {digitos}");
  8.  
  9. static (bool, string) ValidarCnpj(string cnpj) {
  10. if (cnpj.Length < 14) return (false, "");
  11. Span<int> digitos = stackalloc int[14];
  12. for (int i = 0, j = 0; i < 14; j++) if (char.IsDigit(cnpj[j])) digitos[i++] = cnpj[j] - 48;
  13. int soma = 0, soma2 = 0;
  14. for (var i = 0; i < 4; i++) {
  15. soma += digitos[i] * (5 - i);
  16. soma2 += digitos[i] * (6 - i);
  17. }
  18. soma2 += digitos[4] * 2;
  19. for (var i = 4; i < 11; i++) {
  20. soma += digitos[i] * (13 - i);
  21. soma2 += digitos[i + 1] * (13 - i);
  22. }
  23. soma += digitos[11] * 2;
  24. var resto = soma % 11;
  25. var dv = digitos[12];
  26. digitos[12] = resto < 2 ? 0 : 11 - resto;
  27. soma2 += digitos[12] * 2;
  28. var ok = digitos[12] == dv;
  29. resto = soma2 % 11;
  30. dv = digitos[13];
  31. digitos[13] = resto < 2 ? 0 : 11 - resto;
  32. return (ok && digitos[13] == dv, string.Concat(digitos[12], digitos[13]));
  33. }
  34.  
  35. //https://pt.stackoverflow.com/q/60577/101
Success #stdin #stdout 0.05s 24644KB
stdin
Standard input is empty
stdout
Dígitos finais corretos seriam 30
Dígitos finais corretos seriam 30