【函数递归】1569: 十进制转八进制(change) [2*]

题目描述

十进制转八进制(change)
【问题】用递归的方法将十进制整数n转换成八进制整数m

【输入】n 【输出】m

提示:辗转相除

代码如下

#include <iostream>

// 递归函数,将十进制数 n 转换为八进制数

int decimalToOctal(int n) {

    if (n == 0)

        return 0;

    else

        return (decimalToOctal(n / 8) * 10 + n % 8);

}

int main() {

    int n;

    std::cout << "请输入一个十进制整数: ";

    std::cin >> n;

    int octalNumber = decimalToOctal(n);

    std::cout << "对应的八进制数是: " << octalNumber << std::endl;

    return 0;

}

#include <stdio.h> #include <string.h> #include <math.h> #include <ctype.h> #define MAX_LEN 100 /// 将二进制字符串转换十进制整数 int binaryToDecimal(const char* binary) { int decimal = 0; int length = strlen(binary); for (int i = 0; i < length; i++) { if (binary[i] == '1') { decimal += pow(2, length - i - 1); } } return decimal; } /// 将十进制整数转换为二进制字符串 void decimalToBinary(int decimal, char* binary) { int index = 0; while (decimal > 0) { binary[index++] = (decimal % 2) + '0'; decimal /= 2; } binary[index] = '\0'; for (int i = 0, j = index - 1; i < j; i++, j--) { char temp = binary[i]; binary[i] = binary[j]; binary[j] = temp; } } /// 将八进制字符串转换十进制整数 int octalToDecimal(const char* octal) { int decimal = 0; int length = strlen(octal); for (int i = 0; i < length; i++) { decimal += (octal[i] - '0') * pow(8, length - i - 1); } return decimal; } /// 将十进制整数转换八进制字符串 void decimalToOctal(int decimal, char* octal) { int index = 0; while (decimal > 0) { octal[index++] = (decimal % 8) + '0'; decimal /= 8; } octal[index] = '\0'; for (int i = 0, j = index - 1; i < j; i++, j--) { char temp = octal[i]; octal[i] = octal[j]; octal[j] = temp; } } /// 将十六进制字符串转换十进制整数 int hexadecimalToDecimal(const char* hexadecimal) { int decimal = 0; int length = strlen(hexadecimal); for (int i = 0; i < length; i++) { int digit; if (hexadecimal[i] >= '0' && hexadecimal[i] <= '9') { digit = hexadecimal[i] - '0'; } else if (hexadecimal[i] >= 'A' && hexadecimal[i] <= 'F') { digit = hexadecimal[i] - 'A' + 10; } else if (hexadecimal[i] >= 'a' && hexadecimal[i] <= 'f') { digit = hexadecimal[i] - 'a' + 10; } else { printf("Invalid character in hexadecimal string.\n"); return -1; } decimal += digit * pow(16, length - i - 1); } return decimal; } /// 将十进制整数转换为十六进制字符串 void decimalToHexadecimal(int decimal, char* hexadecimal) { int index = 0; while (decimal > 0) { int remainder = decimal % 16; if (remainder < 10) { hexadecimal[index++] = remainder + '0'; } else { hexadecimal[index++] = remainder - 10 + 'A'; } decimal /= 16; } hexadecimal[index] = '\0'; for (int i = 0, j = index - 1; i < j; i++, j--) { char temp = hexadecimal[i]; hexadecimal[i] = hexadecimal[j]; hexadecimal[j] = temp; } } /// 验证输入是否为合法的二进制字符串 int isValidBinary(const char* str) { for (int i = 0; str[i] != '\0'; i++) { if (str[i] != '0' && str[i] != '1') { return 0; } } return 1; } /// 验证输入是否为合法的八进制字符串 int isValidOctal(const char* str) { for (int i = 0; str[i] != '\0'; i++) { if (str[i] < '0' || str[i] > '7') { return 0; } } return 1; } /// 验证输入是否为合法的十六进制字符串 int isValidHexadecimal(const char* str) { for (int i = 0; str[i] != '\0'; i++) { if (!(str[i] >= '0' && str[i] <= '9') && !(str[i] >= 'A' && str[i] <= 'F') && !(str[i] >= 'a' && str[i] <= 'f')) { return 0; } } return 1; } /// 将任意进制字符串转换十进制整数 long baseToDecimal(const char* str, int base) { long decimal = 0; int length = strlen(str); for (int i = 0; i < length; i++) { int digit; if (str[i] >= '0' && str[i] <= '9') { digit = str[i] - '0'; } else if (str[i] >= 'A' && str[i] <= 'Z') { digit = str[i] - 'A' + 10; } else if (str[i] >= 'a' && str[i] <= 'z') { digit = str[i] - 'a' + 10; } else { printf("Invalid character in input string.\n"); return -1; } if (digit >= base) { printf("Digit out of range for base %d.\n", base); return -1; } decimal += digit * pow(base, length - i - 1); } return decimal; } /// 将十进制整数转换为任意进制字符串 void decimalToBase(int decimal, int base, char* output) { int index = 0; while (decimal > 0) { int remainder = decimal % base; if (remainder < 10) { output[index++] = remainder + '0'; } else { output[index++] = remainder - 10 + 'A'; } decimal /= base; } output[index] = '\0'; for (int i = 0, j = index - 1; i < j; i++, j--) { char temp = output[i]; output[i] = output[j]; output[j] = temp; } } /// 主函数:实现用户交互并调用上述函数 int main() { char input[MAX_LEN]; char output[MAX_LEN]; int choice, decimal, base; while (1) { printf("\n=== 进制转换程序 ===\n"); printf("1. 二进制十进制\n"); printf("2. 十进制二进制\n"); printf("3. 八进制十进制\n"); printf("4. 十进制八进制\n"); printf("5. 十六进制十进制\n"); printf("6. 十进制十六进制\n"); printf("7. 验证二进制字符串合法性\n"); printf("8. 验证八进制字符串合法性\n"); printf("9. 验证十六进制字符串合法性\n"); printf("10. 任意进制十进制\n"); printf("11. 十进制任意进制\n"); printf("12. 退出\n"); printf("请选择操作: "); scanf("%d", &choice); switch (choice) { case 1: printf("请输入二进制数: "); scanf("%s", input); if (!isValidBinary(input)) { printf("输入的二进制数不合法。\n"); break; } decimal = binaryToDecimal(input); printf("对应的十进制数为: %d\n", decimal); break; case 2: printf("请输入十进制: "); scanf("%d", &decimal); decimalToBinary(decimal, output); printf("对应的二进制数为: %s\n", output); break; case 3: printf("请输入八进制: "); scanf("%s", input); if (!isValidOctal(input)) { printf("输入的八进制数不合法。\n"); break; } decimal = octalToDecimal(input); printf("对应的十进制数为: %d\n", decimal); break; case 4: printf("请输入十进制: "); scanf("%d", &decimal); decimalToOctal(decimal, output); printf("对应的八进制数为: %s\n", output); break; case 5: printf("请输入十六进制数: "); scanf("%s", input); if (!isValidHexadecimal(input)) { printf("输入的十六进制数不合法。\n"); break; } decimal = hexadecimalToDecimal(input); printf("对应的十进制数为: %d\n", decimal); break; case 6: printf("请输入十进制: "); scanf("%d", &decimal); decimalToHexadecimal(decimal, output); printf("对应的十六进制数为: %s\n", output); break; case 7: printf("请输入字符串以验证是否为合法的二进制数: "); scanf("%s", input); if (isValidBinary(input)) { printf("输入的字符串是合法的二进制数。\n"); } else { printf("输入的字符串不是合法的二进制数。\n"); } break; case 8: printf("请输入字符串以验证是否为合法的八进制: "); scanf("%s", input); if (isValidOctal(input)) { printf("输入的字符串是合法的八进制数。\n"); } else { printf("输入的字符串不是合法的八进制数。\n"); } break; case 9: printf("请输入字符串以验证是否为合法的十六进制数: "); scanf("%s", input); if (isValidHexadecimal(input)) { printf("输入的字符串是合法的十六进制数。\n"); } else { printf("输入的字符串不是合法的十六进制数。\n"); } break; case 10: printf("请输入任意进制数: "); scanf("%s", input); printf("请输入进制基数(2-36): "); scanf("%d", &base); if (base < 2 || base > 36) { printf("无效的进制基数。\n"); break; } decimal = baseToDecimal(input, base); printf("对应的十进制数为: %ld\n", decimal); break; case 11: printf("请输入十进制: "); scanf("%d", &decimal); printf("请输入目标进制基数(2-36): "); scanf("%d", &base); if (base < 2 || base > 36) { printf("无效的进制基数。\n"); break; } decimalToBase(decimal, base, output); printf("对应的%d进制数为: %s\n", base, output); break; case 12: printf("退出程序。\n"); return 0; default: printf("无效的选择,请重新输入。\n"); } } return 0; } 分析代码
06-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱呱呱~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值