using System; namespace Divisibilidad { class Program { static void Main( string [] args ) { string N = "239058"; Divisibilidad d = new Divisibilidad( 7, 3 ); Console.WriteLine( d.mod( N ) ); } } class Divisibilidad { private int _div; private int _dig; private int [] _delta; public Divisibilidad( int divisor ) { init( divisor, 1 ); } public Divisibilidad( int divisor, int digitos ) { init( divisor, digitos ); } public int mod( string bigN ) { { // dígitos múltiplo de _dig int r = bigN.Length % _dig; if( r != 0 ) bigN = ( new String( '0', _dig - r ) ) + bigN; } int p = 0, q = 0, D = 0, d = 0; // si en lugar de empaquetar bigN en ASCII se empaqueta en // BDC (o equivalente), se pueden sólo es necesario realizar // / <_dig> iteraciones. Por simplicidad se // "subitera" sobre el grupo. foreach( char c in bigN ) { D = ( D << 3 ) + D + D; D += c - '0'; if( ++d == _dig ) { p = _delta [ q = p + D ]; D = d = 0; } } return q % _div; } private void init( int d, int g ) { _div = d; _dig = g; int p10 = 1; for( int dg = g; dg > 0; dg-- ) p10 *= 10; _delta = new int [ p10 + d - 1 ]; for( int i = 0; i < _delta.Length; i++ ) _delta [ i ] = ( p10 * ( ( i + d ) % d ) ) % d; } } }