最佳答案
黑洞排序,又稱為 Kaprekar 算法,是一種獨特的排序算法,它經由過程一系列的數學操縱將一個四位數轉換成數字黑洞 6174。這個算法最初由印度數學家 D.R. Kaprekar 提出,因其獨特的性質跟簡單的實現方法而遭到關注。
黑洞排序算法道理
黑洞排序的基本頭腦是將一個四位數的數字按照非遞增次序陳列跟遞減次序陳列,然後相減,重複這個過程,終極會掉掉落數字 6174,也就是數字黑洞。以下是具體的步調:
- 輸入一個四位數,假如這個數是 6174,則直接輸出成果。
- 將這個數的每一位數字按照非遞增次序陳列,掉掉落一個新數。
- 將這個數的每一位數字按照遞減次序陳列,掉掉落另一個新數。
- 用步調 2 中掉掉落的新數減去步調 3 中掉掉落的新數。
- 將掉掉落的差值作為新的四位數,重複步調 2 到 4,直到成果為 6174。
C言語實現黑洞排序
下面是利用 C 言語實現黑洞排序的代碼示例:
#include <stdio.h>
// 將四位數轉換為字符串
void toStr(int num, char str[5]) {
str[0] = num / 1000 + '0';
str[1] = (num % 1000) / 100 + '0';
str[2] = (num % 100) / 10 + '0';
str[3] = num % 10 + '0';
str[4] = '\0';
}
// 比較兩個字符串的大小,前去值與strcmp雷同
int customStrCmp(const char *a, const char *b) {
int i = 0;
while (a[i] != '\0' && b[i] != '\0') {
if (a[i] != b[i]) return a[i] - b[i];
i++;
}
return a[i] - b[i];
}
// 履行黑洞排序
void kaprekarRoutine(int num) {
int count = 0;
char str[5];
while (num != 6174) {
toStr(num, str);
char max[5] = {str[0], str[1], str[2], str[3], '\0'};
char min[5] = {str[0], str[1], str[2], str[3], '\0'};
int i = 0, j = 0;
// 生成最大年夜數跟最小數
for (i = 0; i < 4; i++) {
if (str[i] > max[i]) {
for (j = 3; j >= i; j--) {
max[j] = max[j - 1];
}
max[i] = str[i];
}
if (str[i] < min[i]) {
for (j = 3; j >= i; j--) {
min[j] = min[j - 1];
}
min[i] = str[i];
}
}
// 打算差值
num = (customStrCmp(max, min) > 0) ? customStrCmp(max, min) : customStrCmp(min, max);
printf("%s - %s %d\n", max, min, num);
count++;
}
printf("Number of operations: %d\n", count);
}
int main() {
int num;
scanf("%d", &num);
if (num == 6174) {
printf("%d\n", num);
} else {
kaprekarRoutine(num);
}
return 0;
}
實戰技能
- 字符串處理:黑洞排序算法涉及到字符串的處理,可能利用字符串來便利地停止排序跟比較操縱。
- 數學操縱:懂得數學操縱是關鍵,特別是怎樣將四位數轉換為字符串,以及怎樣從字符串中生成最大年夜數跟最小數。
- 輪回跟遞歸:黑洞排序算法可能經由過程輪回實現,但遞歸可能會使代碼愈加簡潔易懂。
經由過程以上剖析跟實戰技能,你可能更好地懂得跟實現黑洞排序算法。