194 lines
4.6 KiB
C
194 lines
4.6 KiB
C
//
|
||
// Created by CC-star on 25-5-6.
|
||
//
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
int R,num;//需要得到的进制,输入的整数
|
||
char num_16[100]; // 十六进制
|
||
int R_choice;//原本进制
|
||
|
||
|
||
// void Pr_Start() {
|
||
// int power = 1; // R进制的幂,从R^0=1开始
|
||
// }
|
||
|
||
|
||
//十进制转2进制
|
||
void DectoBin() {
|
||
int arr[100],length = 0;
|
||
while(num){
|
||
arr[length++] = num % 2;
|
||
num/=2;
|
||
}
|
||
printf("对应2进制表示为:");
|
||
for(int i = length-1;i>=0;i--){
|
||
printf("%d",arr[i]);
|
||
}
|
||
printf("\n");
|
||
}
|
||
|
||
|
||
//十进制转R进制
|
||
void DectoR() {
|
||
switch(R){
|
||
//十进制转二进制
|
||
case 2:
|
||
DectoBin();
|
||
break;
|
||
//十进制转8进制
|
||
case 8:
|
||
printf("对应8进制表示为:%o\n",num);
|
||
break;
|
||
case 10:
|
||
printf("对应10进制表示为:%d\n",num);
|
||
break;
|
||
//十进制转16进制
|
||
case 16:
|
||
printf("对应16进制表示为:%x\n",num);
|
||
break;
|
||
default:
|
||
printf("输入有误!目前只支持2、8、10、16进制间的转换\n");
|
||
break;
|
||
}
|
||
}
|
||
|
||
//2进制转10进制
|
||
void BintoDec() {
|
||
int s = 0;
|
||
int i = 0;
|
||
int power = 1;
|
||
while (num > 0) {
|
||
s += (num % 10) * power;
|
||
power *= 2;
|
||
num/=10;
|
||
i++;
|
||
}
|
||
num = s;
|
||
DectoR();
|
||
}
|
||
|
||
//8进制转10进制
|
||
void OcttoDec() {
|
||
int s = 0;
|
||
int i = 0;
|
||
int power = 1;
|
||
while (num > 0) {
|
||
s += (num % 10) * power;
|
||
power *= 8;
|
||
num/=10;
|
||
i++;
|
||
}
|
||
num = s;
|
||
DectoR();
|
||
}
|
||
|
||
//16进制转10进制
|
||
void HextoDec() {
|
||
int s = 0; // 十进制结果
|
||
int len = strlen(num_16);
|
||
int power = 1;
|
||
for(int i = len-1; i >= 0; i--) {
|
||
int digit;
|
||
|
||
if(num_16[i] >= '0' && num_16[i] <= '9') {
|
||
digit = num_16[i] - '0';
|
||
}
|
||
else if(num_16[i] >= 'A' && num_16[i] <= 'F') {
|
||
digit = num_16[i] - 'A' + 10;
|
||
}
|
||
else if(num_16[i] >= 'a' && num_16[i] <= 'f') {
|
||
digit = num_16[i] - 'a' + 10;
|
||
}
|
||
else {
|
||
// 既不是数字也不是字母a-f/A-F,输入错误
|
||
printf("错误:输入的不是有效的%d进制数!\n",R_choice);
|
||
return ;
|
||
}
|
||
s = s + digit * power;
|
||
power *= 16;
|
||
}
|
||
num = s;
|
||
DectoR();
|
||
}
|
||
|
||
|
||
|
||
int Input() {
|
||
printf("输入你的%d进制数:",R_choice);
|
||
scanf("%d",&num);
|
||
while (getchar() != '\n');
|
||
if(num < 0) {
|
||
printf("错误:请输入正数!\n");
|
||
return 0;
|
||
}
|
||
int tmp = num;
|
||
int a;
|
||
while (tmp > 0) {
|
||
a = tmp % 10;
|
||
if (a >= R_choice) {
|
||
printf("错误:输入的不是有效的%d进制数!\n",R_choice);
|
||
return 0;
|
||
}
|
||
tmp /= 10;//去掉个位
|
||
}
|
||
printf("输入你要得到的R进制:");
|
||
scanf("%d",&R);
|
||
while (getchar() != '\n');
|
||
return 1;
|
||
}
|
||
|
||
int C1main(){
|
||
int opt;
|
||
while (1) {
|
||
printf("---------------------👇进制转换【整数|正数】控制面板👇----------------------\n");
|
||
printf("1:2进制转R\n2:8进制转R\n");
|
||
printf("3:10进制转R\n4:16进制转R\n");
|
||
printf("0.返回主控制台\n");
|
||
printf("-----------------------👆选择对应数字👆------------------------\n");
|
||
printf("请输入选择:");
|
||
scanf("%d", &opt);
|
||
//固定原始数字的进制
|
||
if (opt == 1) {
|
||
R_choice =2;
|
||
}else if(opt == 2) {
|
||
R_choice=8;
|
||
}else if(opt == 3) {
|
||
R_choice=10;
|
||
}else if(opt == 4) {
|
||
R_choice=16;
|
||
}
|
||
switch (opt) {
|
||
case 1://2进制转R
|
||
if(Input() == 1) {
|
||
BintoDec();
|
||
}
|
||
break;
|
||
case 2://8进制转R
|
||
if(Input() == 1) {
|
||
OcttoDec();
|
||
}
|
||
break;
|
||
case 3://10进制转R
|
||
if(Input() == 1) {
|
||
DectoR();
|
||
}
|
||
break;
|
||
case 4://16进制转R
|
||
printf("输入你的16进制数:");
|
||
scanf("%s", num_16);
|
||
printf("输入你要得到的R进制:");
|
||
scanf("%d",&R);
|
||
HextoDec();
|
||
break;
|
||
case 0:
|
||
printf("⚠️返回主控制台中...⚠️\n");
|
||
return 0;
|
||
default:
|
||
printf("⚠️输入有误,请重新输入⚠️\n");
|
||
break;
|
||
}
|
||
}
|
||
}
|