86 lines
1.8 KiB
C++
86 lines
1.8 KiB
C++
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <math.h>
|
||
|
||
// 計算在指定進位制下的位數
|
||
int getDigitCount(int num, int base) {
|
||
int count = 0;
|
||
while (num > 0) {
|
||
count++;
|
||
num /= base;
|
||
}
|
||
return count;
|
||
}
|
||
|
||
// 檢查是否為阿姆斯壯數
|
||
int isArmstrong(int num, int base) {
|
||
int originalNum = num;
|
||
int digitCount = getDigitCount(num, base);
|
||
int sum = 0;
|
||
|
||
while (num > 0) {
|
||
int digit = num % base;
|
||
sum += pow(digit, digitCount);
|
||
num /= base;
|
||
}
|
||
|
||
return (sum == originalNum);
|
||
}
|
||
|
||
// 將數字轉換為指定進位制的字串表示
|
||
void printNumber(int num, int base) {
|
||
if (num < 10) {
|
||
printf("%d", num);
|
||
} else {
|
||
printf("%c", 'A' + (num - 10));
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
int count = 0;
|
||
int targetCount;
|
||
int base;
|
||
int num = 1;
|
||
|
||
printf("計算多少個阿姆斯壯數? ==> ");
|
||
scanf("%d", &targetCount);
|
||
|
||
printf("輸入基底(<16) ==> ");
|
||
scanf("%d", &base);
|
||
|
||
if (base < 2 || base > 16) {
|
||
printf("基底必須在2到15之間\n");
|
||
return 1;
|
||
}
|
||
|
||
printf("\n在%d進位制下的前%d個阿姆斯壯數:\n", base, targetCount);
|
||
|
||
while (count < targetCount) {
|
||
if (isArmstrong(num, base)) {
|
||
printf("#%d\t", count + 1);
|
||
|
||
// 印出數字的進位制表示
|
||
int temp = num;
|
||
int digits[32];
|
||
int digitCount = 0;
|
||
|
||
// 轉換為指定進位制
|
||
while (temp > 0) {
|
||
digits[digitCount++] = temp % base;
|
||
temp /= base;
|
||
}
|
||
|
||
// 反向印出數字
|
||
for (int i = digitCount - 1; i >= 0; i--) {
|
||
printNumber(digits[i], base);
|
||
}
|
||
printf("\n");
|
||
|
||
count++;
|
||
}
|
||
num++;
|
||
}
|
||
|
||
return 0;
|
||
}
|