ACM 6174問題

OpenSoucre發表於2014-03-31

6174問題

時間限制:1000 ms  |  記憶體限制:65535 KB
難度:2
 
描述

假設你有一個各位數字互不相同的四位數,把所有的數字從大到小排序後得到a,從小到大後得到b,然後用a-b替換原來這個數,並且繼續操作。例如,從1234出發,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!現在要你寫一個程式來判斷一個四位數經過多少次這樣的操作能出現迴圈,並且求出操作的次數

比如輸入1234執行順序是1234->3087->8352->6174->6174,輸出是4

 
輸入
第一行輸入n,代表有n組測試資料。
接下來n行每行都寫一個各位數字互不相同的四位數
輸出
經過多少次上面描述的操作才能出現迴圈
樣例輸入
1
1234
樣例輸出
4

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
vector<int> numCnt;
int solve(int num){
    vector<int> a(4);
    a[0] = num%10;
    a[1] = num/10%10;
    a[2] = num/100%10;
    a[3] = num/1000;
    sort(a.begin(),a.end());
    int num1 = a[3]*1000+a[2]*100 +a[1]*10+a[0];
    int num2 = a[3]+a[2]*10+a[1]*100 + a[0]*1000;
    vector<int>::iterator iter = find(numCnt.begin(),numCnt.end(),num1-num2);
    if(iter!=numCnt.end()) return distance(numCnt.begin(),iter)+1;
    else {
        numCnt.push_back(num1-num2);
        return solve(num1-num2);
    }
}

int main(){
    int n;
    cin >> n;
    for(int icase  = 0 ; icase < n; ++icase){
        int num;
        cin >> num;
        numCnt.push_back(num);
        cout<<solve(num)<<endl;
        numCnt.clear();
    }
}