[笔记]一道C语言面试题:得到整数的M进制表示字符串

本文介绍如何使用C语言实现整数在不同进制下的表示转换,通过具体实例展示了从十进制到十六进制的转换过程及代码实现。

题目:输入整数n和M,输出n在M进制下的表示字符串。如n=3000,M=16,输出16进制下3000的表示字符串,为“BB8”

来源:某500强企业面试题目

思路:对n取模M,将得到的数字压入栈中,再令 n = n / M 的商。重复这一过程,可以得到每一位的数字。

将栈内的数字出栈,并转为字符表达,凑成完整的字符串即可

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//----------------------------------------
// 将n用M进制表示并输出
//----------------------------------------
#define MAX_NUM 1024
char *M_Ary(int n, int M) {
  int Ary[MAX_NUM] = {0};
  char *str = 0;
  int i = 0;
  int a = 0;
  int b = 0;
  int c = 0;
  int num = 0;

  
  i = 0;
  a = n;
  while (a >= M) {              // 反复取余,放入Ary数组中
    b = a % M;                  // 取余数
    a = a / M;                  // 取商
    Ary[i] = b;
    i++;
    
    if (i > MAX_NUM-1) return 0;// 如果越界,返回NULL
  }
  Ary[i] = a;

  num = i + 1;                  // 获得数组长度
  str = (char*)malloc(num + 1); // 创建字符串
  if (!str) return 0;           // 如果创建失败,返回NULL

  memset(str, 0, num + 1);      // 清空字符串

  for (i = 0; i < num; i++) {   // 倒序将Ary数组的数字放入str中
    c = Ary[num - i - 1];
    if (c < 10) {      
      str[i] = '0' + c;         // 如果是 0-9,则输出数字
    } else {      
      str[i] = 'A' + (c - 10);  // 如果是 > 10,则输出A-Z
    }
  }

  return str;
}

//-------------------------------------------------------------------------

void TestM_Ary(void) {
  int n, M;
  char *str = 0;

  n = 10;
  M = 2;
  str = M_Ary(n, M);
  printf("M_Ary(%d, %d) = %s\n", n, M, str);
  free(str);

  n = 100;
  M = 8;
  str = M_Ary(n, M);
  printf("M_Ary(%d, %d) = %s\n", n, M, str);
  free(str);

  n = 3000;
  M = 16;
  str = M_Ary(n, M);
  printf("M_Ary(%d, %d) = %s\n", n, M, str);
  free(str);
}

//-------------------------------------------------------------------------

int main(int argc, char *argv[]) {
  TestM_Ary();

  getchar();
  return 0;
}
Technorati 标签: C语言, 面试题

转载于:https://www.cnblogs.com/journeyonmyway/archive/2011/09/06/2169301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值