/* * File: magic.cc * Author: Leonid Lenyashin */ #include #include #include #include using namespace std; set history; int len = 0 void do_magic(long num) { static int digit[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int count = len; long val = num; history.insert(num); while(count--) { digit[val % 10]++; val /= 10; } long min = 0, max = 0; int ten_power = 1; for(int i = 0; i < 10; i++) { for(; digit[i]; digit[i]--) { min = min*10 + i; max = i*ten_power + max; ten_power *= 10; } } long new_number = max - min; if(history.find(new_number) != history.end()) { cout << "Looping detected: " << setw(len) << setfill('0') << new_number << ". Stopped." << endl; return; } cout << setw(len) << setfill('0') << max << " - " << setw(len) << setfill('0') << min << " = " << setw(len) << setfill('0') << new_number << endl; do_magic(new_number); } int main(int argc, char** argv) { if(argc <= 1) { cerr << "Usage: " << argv[0] << " " << endl; return -1; } char* str = argv[1]; len = strlen(str); long num = strtol(str, NULL, 10); if(num <= 0 || num == LONG_MAX) { cerr << "Can't parse the argument " << str << endl; return -2; } cout << setw(len) << setfill('0') << str << endl; do_magic(num); return 0; }