6174问题

假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来这个数,并且继续操作。例如:从1234出发,依次可得到4321-1234=3087   8730-378=8352    8532-2358=6174。有趣的是  7641-1467=6174.回到了它自己.

输入一个n位数,输出操作序列,直到出现循环为止(即新得到的数曾经得到过).输入保证在循环之前最多只会产生1000个整数.

样例输入:1234
样例输出:1234->3087->8352->6174->6174

#include "stdafx.h"
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;
int getMax(string inData);
string get_next(string input);
int getMin(string inData);

int _tmain(int argc, _TCHAR* argv[])
{
    vector<string> inData;
    string input;
    cin>>input;
    
    string res=input;
    while(find(inData.begin(),inData.end(),res)==inData.end()){
        inData.push_back(res);
        cout<<res<<"->";
        res=get_next(res);
    }
    cout<<inData[inData.size()-1]<<endl;
    return 0;
}
string get_next(string input)
{
    int max = getMax(input);
    int min = getMin(input);
    ostringstream oss;
    oss<<max-min;
    string result = oss.str();
    return result;

}
int getMin(string inData)
{
    string data =inData;
    int len = data.size();
    for(int i=0;i!=len;i++)
    {
        for(int j =i+1 ;j!=len;++j)
        {
            if(data[i]>data[j])
            {
                int temp = data[j];
                data[j]=data[i];
                data[i]=temp;
            }
        }
    }
    return atoi(data.c_str());
}

int getMax(string inData)
{
    string data =inData;
    int len = data.size();
    for(int i=0;i!=len;i++)
    {
        for(int j =i+1 ;j!=len;++j)
        {
            if(data[i]<data[j])
            {
                int temp = data[j];
                data[j]=data[i];
                data[i]=temp;
            }
        }
    }
    return atoi(data.c_str());
}
原文地址:https://www.cnblogs.com/crazycodehzp/p/3519760.html