1350:Cabric Number Problem
keyword
整数 C++
概要
10進数で考える。4桁の整数に対して、それを並び替えてできる最大の数と最小の数(leading 0もOK)の差を引くことを繰り返すと6174か0に落ちることが知られている。それをシミュレートする問題。
やるだけ、としか。あと問題文が色々不親切。
int ds[] = {1,10,100,1000}; void solve(int n){ printf("N=%d:\n",n); if(n < 1000 || n > 9999 || n%1111==0){ puts("No!!"); return ; } if(n == 6174){ puts("Ok!! 0 time"); return ; } int cnt=0; while(1){ int small = 0, big = 0; vector<int> digs; for(int k=0; k<4; k++){ if(n < ds[k])break; digs.push_back((n/ds[k])%10); } sort(digs.begin(), digs.end()); for(int i=0; i<digs.size(); i++) big += digs[i] * ds[i]; reverse(digs.begin(), digs.end()); for(int i=0; i<digs.size(); i++) small += digs[i] * ds[i]; printf("%d-%d=%d\n",big, small, n=big-small); cnt++; if(n == 0 || n == 6174){ printf("Ok!! %d %s\n", cnt, cnt>1?"times":"time"); return ; } } }