1: using System;
2:
3: namespace Divisibilidad {
4:
5: class Program {
6:
7: static void Main( string [] args ) {
8: string N = "239058";
9: Divisibilidad d = new Divisibilidad( 7, 3 );
10: Console.WriteLine( d.mod( N ) );
11: }
12:
13: }
14:
15: class Divisibilidad {
16:
17: private int _div;
18: private int _dig;
19: private int [] _delta;
20:
21: public Divisibilidad( int divisor ) {
22: init( divisor, 1 );
23: }
24: public Divisibilidad( int divisor, int digitos ) {
25: init( divisor, digitos );
26: }
27:
28: public int mod( string bigN ) {
29: { // dígitos múltiplo de _dig
30: int r = bigN.Length % _dig;
31: if( r != 0 )
32: bigN = ( new String( '0', _dig - r ) ) + bigN;
33: }
34: int p = 0, q = 0, D = 0, d = 0;
35:
36: // si en lugar de empaquetar bigN en ASCII se empaqueta en
37: // BDC (o equivalente), se pueden sólo es necesario realizar
38: // <digitos de bigN> / <_dig> iteraciones. Por simplicidad se
39: // "subitera" sobre el grupo.
40: foreach( char c in bigN ) {
41: D = ( D << 3 ) + D + D;
42: D += c - '0';
43: if( ++d == _dig ) {
44: p = _delta [ q = p + D ];
45: D = d = 0;
46: }
47: }
48: return q % _div;
49: }
50:
51: private void init( int d, int g ) {
52: _div = d;
53: _dig = g;
54: int p10 = 1;
55: for( int dg = g; dg > 0; dg-- )
56: p10 *= 10;
57: _delta = new int [ p10 + d - 1 ];
58: for( int i = 0; i < _delta.Length; i++ )
59: _delta [ i ] = ( p10 * ( ( i + d ) % d ) ) % d;
60: }
61:
62: }
63:
64:
65: }