C语言实现进制转换
程序说明:
1、支持16进制以内的任意两进制之间的转换
2、输入需合法,非法时无提示,此时计算出的值无意义
3、输入合法情况下可使用空格,更直观的检查输入是否正确也便于快速输入
4、输出时自动分隔,便于查看和使用
5、稍加修改就能得到拓展
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<string.h>
int len1=0; //记录结果长度
int to_int_arr(char* charnumber, int* arr); //字符串转整型串
int to_ten(int scale_in, int* arr, int len); //整型串转整型
void get_result(int scale_out, int ten, int* arr1); //整型转结果
void show_result(int arr1[40]); //输出结果
int main(void)
{
int scale_in = 0; //输入进制
int scale_out = 0; //输出进制
int arr[40]={0}; //存整型串
int arr1[40]={0}; //存结果
char charnumber[40]={0}; //存字符输入
char flag=0; //主体框架控制
do
{
printf("注意:现仅支持16进制以内的转换,如需更大范围转换,请自行拓展。\n各数值现允许有空格符插入,注意输入的合法性!!!\n请您分别输入输入进制和输出进制:");
scanf("%d %d", &scale_in,&scale_out);
printf("请您输入数值:");
getchar(); //把上个输入遗留的换行符清理,不然fgets还没输入就过了。
fgets(charnumber, 40, stdin); //使用标准输入流,不超过范围换行符也读取,这不影响程序,反而缓冲区能清理干净,避免后面使用getchar().
printf("%d进制数%s的%d进制形式为:",scale_in,charnumber,scale_out);
get_result(scale_out, to_ten(scale_in, arr, to_int_arr(charnumber, arr)), arr1);
show_result(arr1);
printf("Press q to qiut,else continue:");
scanf("%c", &flag);
} while (flag != 'q');
return 0;
}
int to_int_arr(char* charnumber, int* arr)
{
int j = 0;
for (int i = 0;i < (int)strlen(charnumber);i++)
{
if(charnumber[i]>='0'&&charnumber[i]<='9') //当为数字字符
arr[j++] = charnumber[i] - '0'; //不是字符数字就不行
if (charnumber[i] >= 'A' && charnumber[i] <= 'F') //当为大写字母字符时
arr[j++] = charnumber[i] - 55;
}
return j; //j 元素个数
}
int to_ten(int scale_in, int* arr, int len)
{
int a = 0;
int x = len-1;
for (int i = 0;i <len;i++)
a += arr[i] * (int)pow((double)scale_in, (double)x--);
return a;
}
void get_result(int scale_out, int ten, int* arr1)
{
while (ten != 0)
{
arr1[len1++] = ten % scale_out;
ten /= scale_out;
}
}
void show_result(int arr1[40])
{
int count = 0;
int a = len1;
while (len1)
{
int b = 10;
if (arr1[len1 - 1] < 10)
{
printf("%d", arr1[-1+len1--]);
count++;
}
else
for (int i = 0;i < 6;i++) //逐个对比找出对应字符,一旦找出直接退出循环,退出循环由i=6实现
{
if (arr1[len1 - 1] == b)
{
printf("%c", b + 55);
count++;
len1--;
i = 6;
}
b++;
}
if (a % 4 != 0 && a > 4) //非四的整数倍时,多出几个就从第几个打第一个空格
if (count == a % 4) //求多余的个数,也就是凑不齐四的个数,如5就多余1
printf(" ");
if ((count - a % 4) % 4 == 0 && (count - a % 4) > 0) //排除count为0的情况,四的整数倍时,每隔四个打一个空格
printf(" ");
}
printf("\n\a");
}
运行情况:
C语言实现进制转换
程序说明:
1、支持16进制以内的任意两进制之间的转换
2、输入需合法,非法时无提示,此时计算出的值无意义
3、输入合法情况下可使用空格,更直观的检查输入是否正确也便于快速输入
4、输出时自动分隔,便于查看和使用
5、稍加修改就能得到拓展
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<string.h>
int len1=0; //记录结果长度
int to_int_arr(char* charnumber, int* arr); //字符串转整型串
int to_ten(int scale_in, int* arr, int len); //整型串转整型
void get_result(int scale_out, int ten, int* arr1); //整型转结果
void show_result(int arr1[40]); //输出结果
int main(void)
{
int scale_in = 0; //输入进制
int scale_out = 0; //输出进制
int arr[40]={0}; //存整型串
int arr1[40]={0}; //存结果
char charnumber[40]={0}; //存字符输入
char flag=0; //主体框架控制
do
{
printf("注意:现仅支持16进制以内的转换,如需更大范围转换,请自行拓展。\n各数值现允许有空格符插入,注意输入的合法性!!!\n请您分别输入输入进制和输出进制:");
scanf("%d %d", &scale_in,&scale_out);
printf("请您输入数值:");
getchar(); //把上个输入遗留的换行符清理,不然fgets还没输入就过了。
fgets(charnumber, 40, stdin); //使用标准输入流,不超过范围换行符也读取,这不影响程序,反而缓冲区能清理干净,避免后面使用getchar().
printf("%d进制数%s的%d进制形式为:",scale_in,charnumber,scale_out);
get_result(scale_out, to_ten(scale_in, arr, to_int_arr(charnumber, arr)), arr1);
show_result(arr1);
printf("Press q to qiut,else continue:");
scanf("%c", &flag);
} while (flag != 'q');
return 0;
}
int to_int_arr(char* charnumber, int* arr)
{
int j = 0;
for (int i = 0;i < (int)strlen(charnumber);i++)
{
if(charnumber[i]>='0'&&charnumber[i]<='9') //当为数字字符
arr[j++] = charnumber[i] - '0'; //不是字符数字就不行
if (charnumber[i] >= 'A' && charnumber[i] <= 'F') //当为大写字母字符时
arr[j++] = charnumber[i] - 55;
}
return j; //j 元素个数
}
int to_ten(int scale_in, int* arr, int len)
{
int a = 0;
int x = len-1;
for (int i = 0;i <len;i++)
a += arr[i] * (int)pow((double)scale_in, (double)x--);
return a;
}
void get_result(int scale_out, int ten, int* arr1)
{
while (ten != 0)
{
arr1[len1++] = ten % scale_out;
ten /= scale_out;
}
}
void show_result(int arr1[40])
{
int count = 0;
int a = len1;
while (len1)
{
int b = 10;
if (arr1[len1 - 1] < 10)
{
printf("%d", arr1[-1+len1--]);
count++;
}
else
for (int i = 0;i < 6;i++) //逐个对比找出对应字符,一旦找出直接退出循环,退出循环由i=6实现
{
if (arr1[len1 - 1] == b)
{
printf("%c", b + 55);
count++;
len1--;
i = 6;
}
b++;
}
if (a % 4 != 0 && a > 4) //非四的整数倍时,多出几个就从第几个打第一个空格
if (count == a % 4) //求多余的个数,也就是凑不齐四的个数,如5就多余1
printf(" ");
if ((count - a % 4) % 4 == 0 && (count - a % 4) > 0) //排除count为0的情况,四的整数倍时,每隔四个打一个空格
printf(" ");
}
printf("\n\a");
}
运行情况: