Algorithm --> 6174问题

6174问题

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

 

输入一个n位数,输出操作序列知道出现循环。

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

 

程序:

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;

int num[2000];
int cnt;
bool found;

int getNext(int n)
{
    int a, b;
    char s[10], t;
    sprintf(s, "%d", n);  //将整数打印成字符串保存到s中
    int len = strlen(s);
    for(int i =  0; i < len; i++)
    {
        for(int j = i + 1; j < len; j++)
        {
            if(s[i] > s[j])
            {    
                t = s[i]; s[i] = s[j]; s[j] = t;
            }
        }
    }
    sscanf(s, "%d", &a);  //从s中读入数据
    
    for(int i = 0 ; i < len / 2; i++)
    {
        t = s[i]; s[i] = s[len - 1 - i]; s[len - 1 - i] = t;
    }
    sscanf(s, "%d", &b);
    
    return b - a;
}

int main()
{
    cin >> num[0];
    cout << num[0];
    
    cnt = 1;
    while(true)
    {
        num[cnt] = getNext(num[cnt - 1]);
        cout << " -> " << num[cnt];
        found = false;
        for(int i = 0; i < cnt; i++)
        {
            if(num[i] == num[cnt])
            {
                found = true; 
                break;
            }
        }
        if(found) break;
        cnt++;
    }
    cout << endl;
    return 0;
}

 

posted @ 2015-07-08 15:49  蚂蚁吃大象、  阅读(203)  评论(0编辑  收藏  举报