#include <stdbool.h> //true, false
#include <malloc.h>
#include <stdlib.h> //atoi() 字符串转整数
#include <ctype.h> //isalpha(), isdigit()
#include <string.h>
#include <math.h>
/// 输入字符串数字,字符串长度,该数字是几进制数
/// 返回一个十进制数
int StrToInt(char* str, size_t len, size_t base)
{
bool isnegtive = false //该数是否表示负数
int i = 0
if (str[0] == '-')
{
i++
isnegtive = true
}
int num = 0 // 最后计算出的10进制数
for ( i < len ++i)
{
char tem = toupper(str[i]) //若为字母,转升埋和换成大写字母,其余不变
int index = 0
if (isalpha(tem)) // 若是字母,转化成对应的10进制数
index = tem - 'A' + 10
else if(isdigit(tem))
index = tem - '0'
else { /* do nothing*/ }
num += index * (int)pow(base, len - 1 - i)
}
return isnegtive ? -num : num
}
/// 把10进制数转换成 指定进制的数
void ToBaseNumber(int orig, size_t base)
{
if (orig == 0)
{
printf("%d\n", 0)
return
}
if (orig < 0)
{
putchar('吵盯-')
orig = -orig // 变成正数
}
int* arr = (int* )malloc(sizeof(int) * 16), len = 0, i
while (orig > 0)
{
arr[len++] = orig % base
液枝 orig /= base
}
for (i = len - 1 i >= 0 --i)
{
printf("%d", arr[i])
}
putchar('\n')
return
}
int main(int argc, char const *argv[])
{
int T
scanf("%d", &T)
while (T--)
{
char* chs = (char* )malloc(sizeof(char) * 16)
int n, m
scanf("%s %d %d", chs, &n, &m)
int orig = StrToInt(chs, strnlen(chs, 11), n)
ToBaseNumber(orig, m)
}
return 0
}
C语言中实现10进制转换为任意进制的过程为:
定义数帆雀组int rs[32],保存转换后的数据,整数的转换结果最多32位(4字节*8位)
定义一个数组char map[]={'0','1','2','3',...,'9','A','B',...'F'},完成相应数值对应的转换后的字符
输入10进制数(整数)num
转入转换进制基数(2-16)ind
循环对num进行模ind运算,得磨手到余数存储到数组rs中
num缩小ind倍
当num为0时结束循环
反向输出数组rs中对应的各元素对应的map字符,得到转换结果
参考代码:
#include <stdio.h>int main()
{
char map[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','瞎轿嫌F'}
int i,c[32],num,ind
do {printf("input num: ")scanf("%d", &num )}while(num<0 )
do {printf("input ind: ")scanf("%d", &ind )} while( ind>16||ind<2)
i=0
do {
c[i++]=num%ind
num/=ind
} while(num!=0)
for(i--i>=0i--)
printf("%c",map[c[i]] )
printf("\n")
return 0
}
运行结果:
input num: 100
input ind: 2
1100100
input num: 100
input ind: 8
144
input num: 100
input ind: 16
64
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)