进制转换的程序

进制转换的程序,第1张

#include <stdio.h>

#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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12500781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存