#include <iostream>
#include <string>
using std:: string ;
int CTOI( char a)
{
return a - 48 ;
}
char ITOC( int a)
{
if ( a == 0 )
return '0' ;
return a + '0' ;
}
int creDec( int a, int b)
{
return ( a * 10 ) + b;
}
string divide2( string str)
{
string ret; // Object to be returned.
int rem = 0 ; // Keep track of remainders.
// Iterate over the characters of the input string.
auto iter = str.begin ( ) ;
auto end = str.end ( ) ;
for ( ; iter ! = end; ++ iter )
{
int n1 = CTOI( * iter) ; // The number from the string.
int n2 = creDec( rem, n1) ; // The number after we account for the remainder.
int n3 = n2/ 2 ; // Result of the division.
rem = n2% 2 ; // Remainder of the division.
if ( ret.empty ( ) && n3 == 0 )
{
// Do nothing. There is no need to addd leading zeros to ret.
}
else
{
// Add the character corresponding to n3 to ret.
ret.push_back ( ITOC( n3) ) ;
}
}
// If the return value is an empty string, return "0".
if ( ret.empty ( ) )
{
return "0" ;
}
else
{
return ret;
}
}
void test( string const & in)
{
std:: cout << "Result of dividing " << in << " by 2 is: " << divide2( in) << std:: endl ;
}
int main( )
{
test( "0" ) ;
test( "1" ) ;
test( "2" ) ;
test( "3" ) ;
test( "1183" ) ;
test( "000000000" ) ;
test( "36032092435013184350131843501318435013184350131843501318" ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgc3RkOjpzdHJpbmc7CgppbnQgQ1RPSShjaGFyIGEpCnsKICAgcmV0dXJuIGEgLSA0ODsKfQoKY2hhciBJVE9DKGludCBhKQp7CiAgIGlmIChhID09IDApCiAgICAgIHJldHVybiAnMCc7CiAgIHJldHVybiBhICsgJzAnOwp9CgppbnQgY3JlRGVjKGludCBhLCBpbnQgYikKewogICByZXR1cm4gKGEgKiAxMCkgKyBiOwp9CgpzdHJpbmcgZGl2aWRlMihzdHJpbmcgc3RyKQp7CiAgIHN0cmluZyByZXQ7ICAvLyBPYmplY3QgdG8gYmUgcmV0dXJuZWQuCiAgIGludCByZW0gPSAwOyAvLyBLZWVwIHRyYWNrIG9mIHJlbWFpbmRlcnMuCgogICAvLyBJdGVyYXRlIG92ZXIgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIGlucHV0IHN0cmluZy4KICAgYXV0byBpdGVyID0gc3RyLmJlZ2luKCk7CiAgIGF1dG8gZW5kID0gc3RyLmVuZCgpOwogICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyArK2l0ZXIgKQogICB7CiAgICAgIGludCBuMSA9IENUT0koKml0ZXIpOyAgICAgLy8gVGhlIG51bWJlciBmcm9tIHRoZSBzdHJpbmcuCiAgICAgIGludCBuMiA9IGNyZURlYyhyZW0sIG4xKTsgLy8gVGhlIG51bWJlciBhZnRlciB3ZSBhY2NvdW50IGZvciB0aGUgcmVtYWluZGVyLgogICAgICBpbnQgbjMgPSBuMi8yOyAgICAgICAgICAgIC8vIFJlc3VsdCBvZiB0aGUgZGl2aXNpb24uCiAgICAgIHJlbSA9IG4yJTI7ICAgICAgICAgICAgICAgLy8gUmVtYWluZGVyIG9mIHRoZSBkaXZpc2lvbi4KCiAgICAgIGlmICggcmV0LmVtcHR5KCkgJiYgbjMgPT0gMCApCiAgICAgIHsKICAgICAgICAgLy8gRG8gbm90aGluZy4gVGhlcmUgaXMgbm8gbmVlZCB0byBhZGRkIGxlYWRpbmcgemVyb3MgdG8gcmV0LgogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAvLyBBZGQgdGhlIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIG4zIHRvIHJldC4KICAgICAgICAgcmV0LnB1c2hfYmFjayhJVE9DKG4zKSk7CiAgICAgIH0KICAgfQoKICAgLy8gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcsIHJldHVybiAiMCIuCiAgIGlmICggcmV0LmVtcHR5KCkgKQogICB7CiAgICAgIHJldHVybiAiMCI7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIHJldHVybiByZXQ7CiAgIH0KfQoKdm9pZCB0ZXN0KHN0cmluZyBjb25zdCYgaW4pCnsKICAgc3RkOjpjb3V0IDw8ICJSZXN1bHQgb2YgZGl2aWRpbmcgIiA8PCBpbiA8PCAiIGJ5IDIgaXM6ICIgPDwgZGl2aWRlMihpbikgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgdGVzdCgiMCIpOwogICB0ZXN0KCIxIik7CiAgIHRlc3QoIjIiKTsKICAgdGVzdCgiMyIpOwogICB0ZXN0KCIxMTgzIik7CiAgIHRlc3QoIjAwMDAwMDAwMCIpOwogICB0ZXN0KCIzNjAzMjA5MjQzNTAxMzE4NDM1MDEzMTg0MzUwMTMxODQzNTAxMzE4NDM1MDEzMTg0MzUwMTMxOCIpOwp9Cg==