文章目錄
題目 B1019 數字黑洞
-
題意
輸入一個4位整數,不斷執行以下規則直到爲0
或者爲數字黑洞6174
爲止。
對於整數n
,先將n
中各數字非遞增排序後得到減數,然後遞增排序得到被減數,兩者相減。
輸出執行過程。 -
思路
很明顯涉及到數字的排序,所以需要將整數進行拆分爲整型數組,所以主要完成整型到數組的轉換,以及數組到整型的轉換即可。
注意:
當輸入爲6174
的時候也需要輸出。 -
Code in C++
#include <cstdio>
#include <algorithm>
bool cmp(int a, int b)
{
return a > b;
}
// 整型轉換爲數組
void to_array(int n, int num[])
{
for (int i = 0; i < 4 && n!= 0; ++i)
{
num[i] = n %10;
n /= 10;
}
}
// 數組轉換爲整型
int to_number(int num[])
{
int result = 0;
for (int i = 0; i < 4; ++i)
{
result = result * 10 + num[i];
}
return result;
}
int main()
{
int n, MAX, MIN;
scanf("%d", &n);
int num[5];
while (1)
{
to_array(n, num);
std::sort(num, num + 4);
MIN = to_number(num);
std::sort(num, num + 4, cmp);
MAX = to_number(num);
n = MAX - MIN;
printf("%04d - %04d = %04d\n", MAX, MIN, n);
if (n == 0 || n == 6174) break;
}
return 0;
}
小結
我開始是使用的字符串類型進行存儲,但是在使用過程中會出現一些問題,比如對零的判斷,然後就是在執行一個case
的時候超時了,可能是通過istringstream
進行數字和字符串的轉換過程耗時太多導致。之後儘量用簡潔的方式去實現。