十进制转换为基数2-16(二进制到十六进制)

时间:2013-10-02 22:36:17

标签: c

嘿,我正在编写一个程序,将十进制数转换为从二进制到十六进制的任何基本单位(2,3,4,....,15,16)。这是我到目前为止,从2 - 15运行任何数字导致无限循环。我想知道你对我项目的其余部分是否有任何建议。运行时,这将要求您输入两个整数,第一个应该是十进制整数> 0,第二个应该是您想要转换为的基本类型。任何和所有建议完成这将非常感谢!谢谢。

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

int main(void){

  int x, y, z, c;

  printf("Please enter two integers: ");
  scanf("%d", &x);
  scanf("%d", &y);

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 | y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  }
  else if(y > 1 && y < 16){

       while(z != 0){
       z = (x/y);
       c = (x%y);
       printf("%d\n", z);
       }
    printf("%d\n", z);
    printf("%d\n", c);
  }
      else if(y == 16){
        printf("%X\n", x);
      }

}

** * ** * ** * 的** * ** * ** * ** * * 修改< / EM> * ** * ** * ** * ** * ** * ** * ** *

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

int main(void){

  int x, y, z, c, i;

  printf("Please enter two integers: ");
  scanf("%d", &x);
  scanf("%d", &y);

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  }
  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y);

       if( c > 1 && c < 10){
       printf("%d", c);

    }else if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
   }
  }
    printf("\n");
}

这是我迄今取得的进步。我的问题是:我无法正确输出值A-F来表示数字10-15。另外,我无法以正确的方式显示整数。我认为这是一个简单的修复方法,但是我还不习惯这个命令。谢谢大家的帮助,这非常有益。

** * ** * ** * 编辑2 ** * ** * ** * < / EM> ***

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

int main(void){

  int x, y, z, c; //Sets up variables to be used in program

  printf("Please enter two integers: "); //Asks for user input
  scanf("%d", &x);
  scanf("%d", &y); //stores input

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  } //bug checks

  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y); // Loops numbers until a 0 value is reached, can be used with
                  // any Base

     if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
    }else{
        printf("%d", c);
    }
     // Returns for each remainer option
    }
    printf("\n");
  }
}

好的第三次是魅力。我现在对我的代码唯一的问题是,我无法弄清楚如何以相反的顺序,正确的顺序输出它。忽略我的第二次编辑,我自己解决了。任何输入都会很棒。我真的不知道我怎么会让它逆转出来。谢谢大家!

6 个答案:

答案 0 :(得分:3)

这很有趣。 一些建议:

  • 使用描述性变量名称(基数,余数,数字,数字等)
  • 不要作弊,使用%X是错误的
  • 如何支持duodecadecimal(sp?),base 36?
  • 打印出大于9的数字符号的有用符号(字母?)
  • 考虑终止条件,你没有改变z(余数),因此你的循环
  • 您正在以相反的顺序打印出数字,从右到左而不是从左到右

此版本最多可达36位,打印数字符号字母&gt; 9,并打印反转和预期订单...

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

char BASIFICATION[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int MAXBASE=36;
int main(void)
{
  int done=0;
  long num, base, remainder, digit;

  printf("Number Base Convertificator\n");
  printf("(enter 0 0 when done)\n");
  while( !done)
  {
    printf("Please enter two integers: ");
    scanf("%d", &num);
    scanf("%d", &base);
    if( (base<2) || (base>MAXBASE) ) //avoid precedence until you are comfortable/confident with it
    {
      printf("Please enter base between 2 and %d.\n",MAXBASE);
      if(base<=0) done=1;
      continue;
    }
    printf("%d\n", num);
    printf("%d\n", base);
    printf("\n");
    if(base == MAXBASE) //cheaters never win!
    {
      printf("%XX\n", num);
      continue;
    }
    //if(base > 1 && base < MAXBASE)
    {
      char reversed[99], ndx=0;
      //this prints your digits in reverse order
      remainder = num;
      while(remainder > 0) //numerical methods, avoid skipping below zero (irrelevant here, but good habit)
      {
         digit = (remainder%base);
         remainder = (remainder/base);
         printf("%c ", BASIFICATION[digit]);
         //printf("%c %d (%d)\n", BASIFICATION[digit], digit, remainder);
         reversed[ndx++] = BASIFICATION[digit];
      }
      printf("\n");
      //reverse digits to print in expected order
      for( ; ndx>0; ) { printf("%c ",reversed[--ndx]); }
      printf("\n");
    }
  }
}

跑步时,

Number Base Convertificator
(enter 0 0 when done)
Please enter two integers: 1020 2
1020
2

0 0 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 0 0 
Please enter two integers: 252 16
252
16

C F 
F C 
Please enter two integers: 99 
8
99
8

3 4 1 
1 4 3 

现在,您如何修改此项以将输入字符串转换为指定的基础?

答案 1 :(得分:1)

由于x未在此循环中修改,z总是计算相同的值,循环永远不会退出:

   while(z != 0){
   z = (x/y);
   c = (x%y);
   printf("%d\n", z);
   }

要将数字转换为差异基数,您通常会重复将数字除以基数,剩余部分会给出数字。这将打印出从最后到第一个的数字:

   while(x != 0){
      c = (x%y); /* remainder of x when divided by y */
      x = (x/y); /* x divided by y */
      printf("%d\n", c);
   }

答案 2 :(得分:1)

介绍一种称为干运行的旧式调试过程

x  y  z c (z != 0) 
16 2  8 0  true
      8 0  true DOH!

答案 3 :(得分:0)

此计划的目的是学习如何将数字转换为其他基础,而不仅仅是在为您提供快捷方式时尝试printf。为什么不尝试:

if (y > 1 && y <= 16) {
     parsedNumber = convert(x, y);
} else {
     reportIllegalBase(y);
}

用适当的方法?

另外,请勿将xy用于变量名称。你是为了理解而写的,不是为了玩Code Golf。

您还应该尝试将其设为更通用的程序。不是在计算时打印所有内容,而是构造一个字符串(char[])并打印出来。所以,我建议你写的convert函数应声明为:

char[] convert(const int number, const int base) {...}

void convert(int * const buffer, const int number, const int base) {...}

顺便说一句,如果x是否定的,会发生什么?我不确定你是否做对了。您可能希望首先从用户获取x,然后从用户获取y。这样,如果用户输入1而不是16,您可以给用户第二次机会:

int getBase() {
    int base;
    while(true) {
        printf("Please type in the base: ");
        scanf("%d", &base);
        if (base > 1 && base <= 16) {
            return base;
        } else {
            printf("\nThe base must be between 2 and 16 inclusively.  You typed %d.\n",
                base);
        }
     }
}

顺便说一下,即使它不标准,也有理由使用更高的基数。我用“ Nathaniel S. Borenstein (ISBN 0691037639)编写的一本名为编程,好像人们很重要的书描述了一种情况,即大学在邮寄标签上打印出随机生成的ID。不幸的是,有时ID看起来像 2378gw48fUCk837 he294ShiT4823 ,收件人认为学校正在诅咒他们。

一个委员会召开会议,建议不应出现在这些身份证中的词语。一名学生实习生提出了这个想法,使委员会不必要:只需使用基数31并省去元音。即使用 0123456789bcdfghjklmnpqrstvwxyz 作为基数为31的数字。这减少了工作量,不需要很多编程,让人们失业。

答案 4 :(得分:0)

这很奇怪,你返回0,这意味着当出现错误时“一切都很顺利”,否则你将不会返回任何内容。 再加,是的,你的意思是||不是| 你没有初始化你的z变量,它永远不会进入循环,如果它是0,更糟糕的是,你永远不会对z感兴趣的新值,所以如果它不是0,它永远不会是你,你是无限的环

答案 5 :(得分:0)

#include <stdio.h>
void main(void) {
    char base_digits[16] =
        {'0', '1', '2', '3', '4', '5', '6', '7',
         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    char converted_number[32];
    long int number_to_convert;
    int base, index=0;

    printf("Enter number and desired base: ");
    scanf("%ld %i", &number_to_convert, &base);

    while (number_to_convert != 0)
    {
        converted_number[index] = base_digits[number_to_convert % base];
        number_to_convert = number_to_convert / base;
        ++index;
    }
    --index;
    printf("\n\nConverted Number = ");
    for(  ; index>=0; index--)
    {
        printf("%c", converted_number[index]);
    }
    printf("\n");
}