C++初学者---五位数数字黑洞问题

数字黑洞问题:任意一个五位数,调整其各位数字,分别组成一个最大数字和一个最小数字;将其差值再作为新的数(如果不足5位,则前边补0),再次进行上一操作,直到出现循环。例如41679,首次得差值82962,继续进行,则产生75933,63954,61974。由此构成一个循环数。
输入:41679
输出:[82962,75933,63954,61974]

某软件大赛题目(题目要求列出所有五位数,为便于调试和观察代码仅列出10个数,可自行修改循环条件遍历),解决思路如下:

1、拆分各位数并保存,对拆分后的数排序、构造最大和最小值,求出差值;

2、判断是否出现循环,出现即终止进入下一轮。

欢迎拍砖,^_^

#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

// 从小到大快速排序
void QuickSort(int *pdata, int start, int end)
{
    if (start >= end)
    {
        return;
    }
    
    int itemp = start - 1;
    int key = pdata[end];
    int index;
    for (index = start; index < end; index++)
    {
        if (pdata[index] < key) // 把比key小的数放在左边,大的放在右边。确定分割点
        {
            swap(pdata[index], pdata[++itemp]);
        }
    }
    swap(pdata[itemp+1], pdata[end]);
    
    // 分成两部分后重排
    QuickSort(pdata, start, itemp);
    QuickSort(pdata, itemp + 2, end);
}

// 返回重新排列后的最大、最小数差值
int BlackHole(int number)
{
    const int size = 5;
    int i = 0;
    int save[size];
    const int ten = 10;
    for (i = 0; i < size; i++)
    {
        save[i] = number % ten; // 拆分整数并保存
        number /= ten;
    }

    QuickSort(save, 0, sizeof(save) / sizeof(save[0]) - 1);
    int max = 0;
    int min = 0;
    for (i = 0; i < size; i++)
    {
        max += save[size - 1 - i]; // 构造最大、最小值
        max *= ten;

        min += save[i];
        min *= ten;
    }
    return (max - min) / ten;
}

// 判断最新结果与之前存取的是否有相同的,有返回true反之返回false
bool IsSame(int black)
{
    static vector<int> save; // 找到相同数之前,前面的数仍需保留用以比较,故用static,否则会清掉
    save.push_back(black);
    for (int i = 0; i < save.size(); i++)
    {
        if (save[i] == black && (save.size() - 1) != i)
        {
            save.clear(); // 若找到相同的数则清掉数据,进行下一个数的判断
            return true;
        }
    }

    return false;
}

int main(int argc, char **argv)
{for (int i = 10000; i < 10011; i++)
    {
        int temp = BlackHole(i);
        cout << i << ": " ;
        while (false == IsSame(temp)) // 找到相同的数即终止进入下一轮
        {
            cout << setw(5) << temp << '\t' ;
            temp = BlackHole(temp);
        }
        //cout << temp << endl;
        cout << endl;
    }
    //cout << BlackHole(97911);
    cout << endl;
    
    return 0;
}

 

posted @ 2013-01-25 11:18  小楼一夜听风雨  阅读(1774)  评论(0编辑  收藏  举报