using static System.Console;
using System;
public class Test {
public static void Main() {
(var ok, var digitos) = ValidarCnpj("12345678901234");
if (!ok) WriteLine($"Dígitos finais corretos seriam {digitos}");
(ok, digitos) = ValidarCnpj("12.345.678.9012-34");
if (!ok) WriteLine($"Dígitos finais corretos seriam {digitos}");
}
static (bool, string) ValidarCnpj(string cnpj) {
if (cnpj.Length < 14) return (false, "");
Span<int> digitos = stackalloc int[14];
for (int i = 0, j = 0; i < 14; j++) if (char.IsDigit(cnpj[j])) digitos[i++] = cnpj[j] - 48;
int soma = 0, soma2 = 0;
soma += digitos[0] * 5;
soma2 += digitos[0] * 6;
soma += digitos[1] * 4;
soma2 += digitos[1] * 5;
soma += digitos[2] * 3;
soma2 += digitos[2] * 4;
soma += digitos[3] * 2;
soma2 += digitos[3] * 3;
soma += digitos[4] * 9;
soma2 += digitos[4] * 2;
soma += digitos[5] * 8;
soma2 += digitos[5] * 9;
soma += digitos[6] * 7;
soma2 += digitos[6] * 8;
soma += digitos[7] * 6;
soma2 += digitos[7] * 7;
soma += digitos[8] * 5;
soma2 += digitos[8] * 6;
soma += digitos[9] * 4;
soma2 += digitos[9] * 5;
soma += digitos[10] * 3;
soma2 += digitos[10] * 4;
soma += digitos[11] * 2;
soma2 += digitos[11] * 3;
var resto = soma % 11;
var dv = digitos[12];
digitos[12] = resto < 2 ? 0 : 11 - resto;
soma2 += digitos[12] * 2;
var ok = digitos[12] == dv;
resto = soma2 % 11;
dv = digitos[13];
digitos[13] = resto < 2 ? 0 : 11 - resto;
return (ok && digitos[13] == dv, string.Concat(digitos[12], digitos[13]));
}
}
//https://pt.stackoverflow.com/q/60577/101
dXNpbmcgc3RhdGljIFN5c3RlbS5Db25zb2xlOwp1c2luZyBTeXN0ZW07CgpwdWJsaWMgY2xhc3MgVGVzdCB7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpIHsKCQkodmFyIG9rLCB2YXIgZGlnaXRvcykgPSBWYWxpZGFyQ25waigiMTIzNDU2Nzg5MDEyMzQiKTsKCQlpZiAoIW9rKSBXcml0ZUxpbmUoJCJEw61naXRvcyBmaW5haXMgY29ycmV0b3Mgc2VyaWFtIHtkaWdpdG9zfSIpOwoJCShvaywgZGlnaXRvcykgPSBWYWxpZGFyQ25waigiMTIuMzQ1LjY3OC45MDEyLTM0Iik7CgkJaWYgKCFvaykgV3JpdGVMaW5lKCQiRMOtZ2l0b3MgZmluYWlzIGNvcnJldG9zIHNlcmlhbSB7ZGlnaXRvc30iKTsKCX0KCXN0YXRpYyAoYm9vbCwgc3RyaW5nKSBWYWxpZGFyQ25waihzdHJpbmcgY25waikgewoJICAgIGlmIChjbnBqLkxlbmd0aCA8IDE0KSByZXR1cm4gKGZhbHNlLCAiIik7CgkgICAgU3BhbjxpbnQ+IGRpZ2l0b3MgPSBzdGFja2FsbG9jIGludFsxNF07CgkgICAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgMTQ7IGorKykgaWYgKGNoYXIuSXNEaWdpdChjbnBqW2pdKSkgZGlnaXRvc1tpKytdID0gY25waltqXSAtIDQ4OwoJICAgIGludCBzb21hID0gMCwgc29tYTIgPSAwOwoJICAgIHNvbWEgKz0gZGlnaXRvc1swXSAqIDU7CgkgICAgc29tYTIgKz0gZGlnaXRvc1swXSAqIDY7CgkgICAgc29tYSArPSBkaWdpdG9zWzFdICogNDsKCSAgICBzb21hMiArPSBkaWdpdG9zWzFdICogNTsKCSAgICBzb21hICs9IGRpZ2l0b3NbMl0gKiAzOwoJICAgIHNvbWEyICs9IGRpZ2l0b3NbMl0gKiA0OwoJICAgIHNvbWEgKz0gZGlnaXRvc1szXSAqIDI7CgkgICAgc29tYTIgKz0gZGlnaXRvc1szXSAqIDM7CgkgICAgc29tYSArPSBkaWdpdG9zWzRdICogOTsKCSAgICBzb21hMiArPSBkaWdpdG9zWzRdICogMjsKCSAgICBzb21hICs9IGRpZ2l0b3NbNV0gKiA4OwoJICAgIHNvbWEyICs9IGRpZ2l0b3NbNV0gKiA5OwoJICAgIHNvbWEgKz0gZGlnaXRvc1s2XSAqIDc7CgkgICAgc29tYTIgKz0gZGlnaXRvc1s2XSAqIDg7CgkgICAgc29tYSArPSBkaWdpdG9zWzddICogNjsKCSAgICBzb21hMiArPSBkaWdpdG9zWzddICogNzsKCSAgICBzb21hICs9IGRpZ2l0b3NbOF0gKiA1OwoJICAgIHNvbWEyICs9IGRpZ2l0b3NbOF0gKiA2OwoJICAgIHNvbWEgKz0gZGlnaXRvc1s5XSAqIDQ7CgkgICAgc29tYTIgKz0gZGlnaXRvc1s5XSAqIDU7CgkgICAgc29tYSArPSBkaWdpdG9zWzEwXSAqIDM7CgkgICAgc29tYTIgKz0gZGlnaXRvc1sxMF0gKiA0OwoJICAgIHNvbWEgKz0gZGlnaXRvc1sxMV0gKiAyOwoJICAgIHNvbWEyICs9IGRpZ2l0b3NbMTFdICogMzsKCSAgICB2YXIgcmVzdG8gPSBzb21hICUgMTE7CgkgICAgdmFyIGR2ID0gZGlnaXRvc1sxMl07CgkgICAgZGlnaXRvc1sxMl0gPSByZXN0byA8IDIgPyAwIDogMTEgLSByZXN0bzsKCSAgICBzb21hMiArPSBkaWdpdG9zWzEyXSAqIDI7CgkgICAgdmFyIG9rID0gZGlnaXRvc1sxMl0gPT0gZHY7CgkgICAgcmVzdG8gPSBzb21hMiAlIDExOwoJICAgIGR2ID0gZGlnaXRvc1sxM107CgkgICAgZGlnaXRvc1sxM10gPSByZXN0byA8IDIgPyAwIDogMTEgLSByZXN0bzsKCSAgICByZXR1cm4gKG9rICYmIGRpZ2l0b3NbMTNdID09IGR2LCBzdHJpbmcuQ29uY2F0KGRpZ2l0b3NbMTJdLCBkaWdpdG9zWzEzXSkpOwoJfQp9CgovL2h0dHBzOi8vcHQuc3RhY2tvdmVyZmxvdy5jb20vcS82MDU3Ny8xMDE=