59任由制转换

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

int 文本到整数(char * p_输入) {
 int l_几位数 = strlen(p_输入);
 int l_结果 = 0;
 int i = 0;
 if (p_输入[0] == '-') {
  i = 1;
 }

 for (; i < l_几位数; i++) {
  int l_倍数 = 1;
  for (size_t ii = i; ii < (l_几位数 - 1); ii++) {
   l_倍数 = l_倍数 * 10;
  }
  l_结果 = l_结果 + (p_输入[i] - 48)*l_倍数;
 }
 if (p_输入[0] == '-') {
  return -l_结果;
 }

 return l_结果;
}


char  十进制数字转十六进制字符(int l_十进制) {
 char l_十六进制字符 = 0;
 switch (l_十进制) {
 case 10:
  l_十六进制字符 = 'A';
  break;
 case 11:
  l_十六进制字符 = 'B';
  break;
 case 12:
  l_十六进制字符 = 'C';
  break;
 case 13:
  l_十六进制字符 = 'D';
  break;
 case 14:
  l_十六进制字符 = 'E';
  break;
 case 15:
  l_十六进制字符 = 'F';
  break;
 }
 return l_十六进制字符;
}

int  十六进制字符转十进制数字(char p_十六进制字符) {
 int l_十进制 = 0;
 switch (p_十六进制字符) {
 case 'A':
  l_十进制 = 10;
  break;
 case 'B':
  l_十进制 = 11;
  break;
 case 'C':
  l_十进制 = 12;
  break;
 case 'D':
  l_十进制 = 13;
  break;
 case 'E':
  l_十进制 = 14;
  break;
 case 'F':
  l_十进制 = 15;
  break;
 }
 return l_十进制;
}

void f_进制转换(int p_原始进制, char *p_原始数据, int p_目标进制, char *p_目标数据) {
 if ((p_原始进制 >= 2 && p_原始进制 <= 16) && (p_目标进制 >= 2 && p_目标进制 <= 16)) {


  //不管什么进制,一进入函数,一律转换为十进制.
  int l_十进制 = 0;
  int l_次方 = 0;
  if (p_原始进制 == 10) {
   l_十进制 = 文本到整数(p_原始数据);
  }
  else {
   l_次方 = strlen(p_原始数据) - 1;
   for (size_t i = 0; i < strlen(p_原始数据); i++) {
    if (p_原始数据[i] >= 48 && p_原始数据[i] <= 57) {
     l_十进制 = l_十进制 + (p_原始数据[i] - 48)*pow(p_原始进制, l_次方);
    }
    else {

     l_十进制 = l_十进制 + 十六进制字符转十进制数字(p_原始数据[i])*pow(p_原始进制, l_次方);
    }
    l_次方--;
   }

  }


  //利用求余法,转换进制,但输出结果都是反的.
  int l_商, l_余数, l_备份商;
  char l_反转目标进制[33] = { 0 };
  int l_索引 = 0;
  l_备份商 = l_十进制;

  do {
   l_商 = l_备份商 / p_目标进制;
   l_余数 = l_备份商 % p_目标进制;
   l_备份商 = l_商;
   if (l_余数 >= 0 && l_余数 <= 9) {
    l_反转目标进制[l_索引] = l_余数 + 48;
   }
   else {
    l_反转目标进制[l_索引] = 十进制数字转十六进制字符(l_余数);
   }

   l_索引++;

  } while (l_商 != 0);
  l_反转目标进制[l_索引] = '';

  //开始进行反转
  l_索引 = 0;
  for (int i = strlen(l_反转目标进制) - 1; i >= 0; i--) {
   p_目标数据[l_索引] = l_反转目标进制[i];
   l_索引++;
  }
  p_目标数据[l_索引] = '';

 }

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int 转换(char *输入) {
int 几位数 = strlen(输入) - 1;
int 结果;
for (int i = 0; i < 几位数; i++)
{
int 倍数 = 1;
for (int ii = 0; ii < 几位数 - i; ii++)
{
倍数 = 倍数 * 10;
}
结果 = 结果 + (输入[i] - 48) * 倍数;
}
return 结果;
}
int 转十进制字母(char 字母) {
int 十进制 = 0;
switch (字母) {
case 'A':
十进制 = 10;
break;
case 'B':
十进制 = 11;
break;
case 'C':
十进制 = 12;
break;
case 'D':
十进制 = 13;
break;
case 'E':
十进制 = 14;
break;
case 'F':
十进制 = 15;
break;
}
return 字母;
}


void 进制转换(char *原始数据, int 原始进制, int 目标进制, char *输出数据) {
int 输出 = 0;
int 次方 = strlen(原始数据) - 2;
//二进制转换十进制
//10111B = 1x24 + 0x23 + 1 x22 + 1 x21 + 1 x20 = 23
//十六进制转换十进制
//125H = 1×162+2×161+5×160=293D
if (目标进制 == 10) {

输出 = atoi(原始数据);
}
else {

for (int i = 0; i < strlen(原始数据) - 1; i++)
{

if (原始数据[i] >= 48 && 原始数据[i] <= 57)
{

输出 = 输出 + (原始数据[i] - 48)*pow(目标进制, 次方);
}
else {
输出 = 输出 + 转十进制字母(原始数据[i] - 48)*pow(目标进制, 次方);
}
次方--;
}
}
printf("%d ", 输出);

}
void main() {
char 原始数据[100] = { 0 };
char 原始进制[5] = { 0 };
char 目标进制[5] = { 0 };
char 输出数据[100] = { 0 };
printf("原始数据");
fgets(原始数据, sizeof(原始数据), stdin);
printf("原始进制");
fgets(原始进制, sizeof(原始进制), stdin);
printf("目标进制");
fgets(目标进制, sizeof(目标进制), stdin);
进制转换(原始数据, atoi(原始进制), atoi(目标进制), 输出数据);
system("pause");


}

原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/7896359.html