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; }