@@ -28,33 +28,35 @@ strict namespace BigInt {
2828// ==========================================================================
2929
3030str Add( str a, str b ) {
31- return StrParam( msgbuild: ( msgbuild auto () ) {
31+ return buildmsg ( StrParam () ) {
3232 // Calculate sum.
33- str sum = StrParam( msgbuild: ( msgbuild auto() ) {
34- int i_a = a.length() - 1;
35- int i_b = b.length() - 1;
36- int carry = 0;
37- while ( i_a >= 0 || i_b >= 0 ) {
38- int sum = ( i_a >= 0 ? a[ i_a ] - '0' : 0 ) +
39- ( i_b >= 0 ? b[ i_b ] - '0' : 0 ) + carry;
40- append( d: sum - ( int( sum >= 10 ) * 10 ) );
41- carry = int( sum >= 10 );
42- --i_a;
43- --i_b;
33+ str sum = ( auto() ) {
34+ return buildmsg ( StrParam() ) {
35+ int i_a = a.length() - 1;
36+ int i_b = b.length() - 1;
37+ int carry = 0;
38+ while ( i_a >= 0 || i_b >= 0 ) {
39+ int sum = ( i_a >= 0 ? a[ i_a ] - '0' : 0 ) +
40+ ( i_b >= 0 ? b[ i_b ] - '0' : 0 ) + carry;
41+ append( d: sum - ( int( sum >= 10 ) * 10 ) );
42+ carry = int( sum >= 10 );
43+ --i_a;
44+ --i_b;
45+ }
46+ append( c: carry * '1' );
4447 }
45- append( c: carry * '1' );
46- } );
48+ }();
4749 // Output sum.
4850 int i = sum.length() - 1;
4951 while ( i >= 0 ) {
5052 append( c: sum[ i ] );
5153 --i;
5254 }
53- } );
55+ }
5456}
5557
5658str Sub( str a, str b ) {
57- return StrParam( msgbuild: ( msgbuild auto () ) {
59+ return buildmsg ( StrParam () ) {
5860 // Negative.
5961 if ( Lt( a, b ) ) {
6062 append( c: '-' );
@@ -63,20 +65,22 @@ str Sub( str a, str b ) {
6365 b = temp_a;
6466 }
6567 // Calculate difference.
66- str diff = StrParam( msgbuild: ( msgbuild auto() ) {
67- int i_a = a.length() - 1;
68- int i_b = b.length() - 1;
69- int borrow = 0;
70- while ( i_a >= 0 || i_b >= 0 ) {
71- int digit_a = ( i_a >= 0 ? a[ i_a ] - '0' : 0 );
72- int digit_b = ( i_b >= 0 ? b[ i_b ] - '0' : 0 );
73- append( d: ( digit_a - borrow ) +
74- ( int( digit_a - borrow < digit_b ) * 10 ) - digit_b );
75- borrow = int( digit_a - borrow < digit_b );
76- --i_a;
77- --i_b;
68+ str diff = ( auto() ) {
69+ return buildmsg ( StrParam() ) {
70+ int i_a = a.length() - 1;
71+ int i_b = b.length() - 1;
72+ int borrow = 0;
73+ while ( i_a >= 0 || i_b >= 0 ) {
74+ int digit_a = ( i_a >= 0 ? a[ i_a ] - '0' : 0 );
75+ int digit_b = ( i_b >= 0 ? b[ i_b ] - '0' : 0 );
76+ append( d: ( digit_a - borrow ) +
77+ ( int( digit_a - borrow < digit_b ) * 10 ) - digit_b );
78+ borrow = int( digit_a - borrow < digit_b );
79+ --i_a;
80+ --i_b;
81+ }
7882 }
79- } );
83+ }( );
8084 // Output difference.
8185 int i = diff.length() - 1;
8286 while ( i >= 1 && diff[ i ] == '0' ) {
@@ -86,7 +90,7 @@ str Sub( str a, str b ) {
8690 append( c: diff[ i ] );
8791 --i;
8892 }
89- } );
93+ }
9094}
9195
9296bool Lt( str a, str b ) {
@@ -103,4 +107,4 @@ bool Lt( str a, str b ) {
103107 }
104108}
105109
106- }
110+ }
0 commit comments