using static System.Console;
using System;
(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;
for (var i = 0; i < 4; i++) {
soma += digitos[i] * (5 - i);
soma2 += digitos[i] * (6 - i);
}
soma2 += digitos[4] * 2;
for (var i = 4; i < 11; i++) {
soma += digitos[i] * (13 - i);
soma2 += digitos[i + 1] * (13 - i);
}
soma += digitos[11] * 2;
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
dXNpbmcgc3RhdGljIFN5c3RlbS5Db25zb2xlOwp1c2luZyBTeXN0ZW07CgoodmFyIG9rLCB2YXIgZGlnaXRvcykgPSBWYWxpZGFyQ25waigiMTIzNDU2Nzg5MDEyMzQiKTsKaWYgKCFvaykgV3JpdGVMaW5lKCQiRMOtZ2l0b3MgZmluYWlzIGNvcnJldG9zIHNlcmlhbSB7ZGlnaXRvc30iKTsKKG9rLCBkaWdpdG9zKSA9IFZhbGlkYXJDbnBqKCIxMi4zNDUuNjc4LjkwMTItMzQiKTsKaWYgKCFvaykgV3JpdGVMaW5lKCQiRMOtZ2l0b3MgZmluYWlzIGNvcnJldG9zIHNlcmlhbSB7ZGlnaXRvc30iKTsKCnN0YXRpYyAoYm9vbCwgc3RyaW5nKSBWYWxpZGFyQ25waihzdHJpbmcgY25waikgewoJaWYgKGNucGouTGVuZ3RoIDwgMTQpIHJldHVybiAoZmFsc2UsICIiKTsKICAgIFNwYW48aW50PiBkaWdpdG9zID0gc3RhY2thbGxvYyBpbnRbMTRdOwoJZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgMTQ7IGorKykgaWYgKGNoYXIuSXNEaWdpdChjbnBqW2pdKSkgZGlnaXRvc1tpKytdID0gY25waltqXSAtIDQ4OwogICAgaW50IHNvbWEgPSAwLCBzb21hMiA9IDA7Cglmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgewoJCXNvbWEgKz0gZGlnaXRvc1tpXSAqICg1IC0gaSk7CgkJc29tYTIgKz0gZGlnaXRvc1tpXSAqICg2IC0gaSk7Cgl9Cglzb21hMiArPSBkaWdpdG9zWzRdICogMjsKCWZvciAodmFyIGkgPSA0OyBpIDwgMTE7IGkrKykgewoJCXNvbWEgKz0gZGlnaXRvc1tpXSAqICgxMyAtIGkpOwoJCXNvbWEyICs9IGRpZ2l0b3NbaSArIDFdICogKDEzIC0gaSk7Cgl9Cglzb21hICs9IGRpZ2l0b3NbMTFdICogMjsKICAgIHZhciByZXN0byA9IHNvbWEgJSAxMTsKCXZhciBkdiA9IGRpZ2l0b3NbMTJdOwogICAgZGlnaXRvc1sxMl0gPSByZXN0byA8IDIgPyAwIDogMTEgLSByZXN0bzsKICAgIHNvbWEyICs9IGRpZ2l0b3NbMTJdICogMjsKCXZhciBvayA9IGRpZ2l0b3NbMTJdID09IGR2OwogICAgcmVzdG8gPSBzb21hMiAlIDExOwoJZHYgPSBkaWdpdG9zWzEzXTsKCWRpZ2l0b3NbMTNdID0gcmVzdG8gPCAyID8gMCA6IDExIC0gcmVzdG87CiAgICByZXR1cm4gKG9rICYmIGRpZ2l0b3NbMTNdID09IGR2LCBzdHJpbmcuQ29uY2F0KGRpZ2l0b3NbMTJdLCBkaWdpdG9zWzEzXSkpOwp9CgovL2h0dHBzOi8vcHQuc3RhY2tvdmVyZmxvdy5jb20vcS82MDU3Ny8xMDE=