将数字和字母列表(scanf)转换为单个INT编号

时间:2013-11-21 04:29:45

标签: c algorithm

这部分只是我计划中的一小部分,但希望我能独自管理其他部分。

代码应该使用不同的数字基数,所以让我们在中间切开并假设我们有int base

该基数可以是2(二进制)到36。 你读的数字不能是整数,因为用户可能在其中包含字母,当我说字母时,我的意思是{a=10, b, c, d, ..., z}(z是35),在这种情况下,用户可以决定更大的基数如果数字大于10,则会导致混合输入,例如24e1。 这就是为什么我需要逐位读取这个数字,然后把它变成一个十进制数字(一个普通的,基数为10的数字)。 为了做到这一点,对24e1我应该这样做是不足为奇的:2*base^3+4*base^2+15*base^1+1*base^0(e = 15,如上所述)。

问题是您不能使用stdio.h以外的任何库,并且不允许您使用数组或字符串。

我已经写了一个功能函数,所以你可以跳过这个部分然后输入^然后我会对它进行转换,但是我完全迷失了。我该怎么办? 我怎么能知道会有多少位数...我应该以某种方式计算输入...因为在我们的例子中,第一个数字得到3的幂,我们只知道因为我们已经知道这个数字有4个数字。在那个程序中,我无法告诉你。 另外,我怎样才能将其转回给定的基础?在我使用数字之前,我把它变成十进制数字,用它做我想要的,然后将它返回到所需的基数。我知道如何手动完成,但是如何在代码中执行此操作呢?我需要再次打印数字,但我不知道如何...

到目前为止:

//read until user input is Enter:
    while (num != '\n') { 
        num = getchar();
//because we don't want to be calculating the value of enter:
        if (num == '\n') {
            break; 
        }
//we can assume user input will be numbers or letters in the rightful base
        if (num >= '1' && num <= '9') { 
            // -'0' in order to get the actual number:
            num = num-'0';
            }
        else { 
            // subtract value of W so we start from a=10:
            num = num-'W';
        }
            //THIS LINE should be something that will help me convert num to base 10

在程序中我基本上应该在某个基数上得到2个数字,做数学:num1 + num1,并输出结果在用户提供的相同基础中。

例如,如果用户输入为base = 10 数字: 132, 24

输出应为156

如果用户输入为base = 20 数字: 10, g OUTPUT: 1g

如果用户输入为base = 36 数字: zzz, 1 OUTPUT: 1000

这就是为什么我需要先将它转换为基数10,这样我就可以在那里进行数学计算,然后将其转换回给定的基数并逐位输出。 问题是我不知道如何用大于10的基数做到这一点。

对于基数10(仅数字)和更低,我几乎可以执行以下操作:

numAsInt = 0;
while (num != '\n') { 
        num = getchar();
        if (num == '\n') {
            break; 
        }
        numAsInt = (numAsInt+(num-'0'))*10;
}
numAsInt = NumAsInt/10;

所以基本上如果用户输入是123,基数为10(它执行以下操作:

numAsInt = (1)*10; // numAsInt==10
numAsInt = (12)*10; //numAsInt==120
numAsInt = (123)*10; //numAsInt==1230
numAsInt = 1230/10 //numAsInt==123

这样我就不必知道数字的力量了,因为我不在乎输入(num)有多长,但是当涉及带字母的数字时,我不能这样做。

2 个答案:

答案 0 :(得分:1)

实际上你的z的值为35而不是36。

Regarding your problem, I suggest you do the following:  
1. Initialize SUM = 0.  
2. Read next character.  
3. SUM = SUM*base + value of character.

重复步骤2和3,直到读取所有字符。这种方式即使你从一开始就不知道字符数,SUM也会自动得到读数的值。

这样,您就可以在基数10 变量SUM1和SUM2中获得这两个数字的值。

使用简单+运算符添加它们并在基数10中计算SUM 然后继续除以基数,并在将它们转换为相应的基本字符后将商值输出到屏幕。

余数应为您输出的最后一位数字。

答案 1 :(得分:1)

这是一种简单的方法,在某些文本中,它被称为Horner的多项式规则。

算法: -

0. Set acc = 0

1. Read a character say ch

2. acc = acc*base + value(ch)

3. do 1,2 till end of input.

Horners Rule

编辑: - 以下是C程序来解决您的问题: -

#include<stdio.h>

int valueof(char ch) {


 if(ch>='0'&&ch<='9') {

   return(ch-'0');
 }

 else {

  return(10+ch-'a');

 }

}


char toChar(int i) {

   if(i<10)
     return('0' + i);
   return('a'+i-10);
}

int convert(int base) {

   int acc = 0;
   char ch;
   while((ch=getchar())!='\n') {

       acc = acc*base + valueof(ch);
   }    

   return(acc);
}

void print_base(int base,int num) {
  int k;

  if(num>0) {
     k= toChar(num%base);    
     print_base(base,num/base);
     printf("%c",k);
  }

}



int main() {

  int base,num1,num2,sum;
  printf("Enter the base: ");
  scanf("%d",&base);
  getchar();
  printf("Enter num1: ");
  num1 = convert(base);
  printf("Enter num2: ");
  num2 = convert(base);
  printf("Sum: ");
  sum = num1 + num2;
  print_base(base,sum);


}