对于C,使用高于10的碱基进行扫描

时间:2013-11-18 22:06:11

标签: c char int scanf base

我需要编写一个c程序,而不使用数组或字符串(只有stdio.h库),这将扫描3件事:

  1. NUM1
  2. NUM2
  3. 并打印两件事:

    1. num1 + num2,具有给定的基础
    2. max(num1,num2) - min(num1,num2),给定的基数
    3. 基数可以是2-36,其中10 = a,11 = b,...,36 = z 和num1 / 2将在该基地

      中给出

      我想我可以在将数字转换为10的基数后计算所有内容。我的问题是如何在不使用字符串或数组的情况下将num1,num2拆分为单个整数/字符;以及如何将“3a4”读作“3-10-4”

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>

int inputNumWithBase(int base){
//input num >=0
    int num = 0;
    int ch;

    putchar('>');
    while('\n'!=(ch=getchar())){
        int n;
        switch(ch){
        case '0': n = 0;break;
        case '1': n = 1;break;
        case '2': n = 2;break;
        case '3': n = 3;break;
        case '4': n = 4;break;
        case '5': n = 5;break;
        case '6': n = 6;break;
        case '7': n = 7;break;
        case '8': n = 8;break;
        case '9': n = 9;break;
        case 'a': n = 10;break;
        case 'b': n = 11;break;
        case 'c': n = 12;break;
        case 'd': n = 13;break;
        case 'e': n = 14;break;
        case 'f': n = 15;break;
        case 'g': n = 16;break;
        case 'h': n = 17;break;
        case 'i': n = 18;break;
        case 'j': n = 19;break;
        case 'k': n = 20;break;
        case 'l': n = 21;break;
        case 'm': n = 22;break;
        case 'n': n = 23;break;
        case 'o': n = 24;break;
        case 'p': n = 25;break;
        case 'q': n = 26;break;
        case 'r': n = 27;break;
        case 's': n = 28;break;
        case 't': n = 29;break;
        case 'u': n = 30;break;
        case 'v': n = 31;break;
        case 'w': n = 32;break;
        case 'x': n = 33;break;
        case 'y': n = 34;break;
        case 'z': n = 35;break;
        }
        num = num*base + n;
    }
    return num;
}

int printNum(int num){
        switch(num){
        case 0: putchar('0');break;
        case 1: putchar('1');break;
        case 2: putchar('2');break;
        case 3: putchar('3');break;
        case 4: putchar('4');break;
        case 5: putchar('5');break;
        case 6: putchar('6');break;
        case 7: putchar('7');break;
        case 8: putchar('8');break;
        case 9: putchar('9');break;
        case 10: putchar('a');break;
        case 11: putchar('b');break;
        case 12: putchar('c');break;
        case 13: putchar('d');break;
        case 14: putchar('e');break;
        case 15: putchar('f');break;
        case 16: putchar('g');break;
        case 17: putchar('h');break;
        case 18: putchar('i');break;
        case 19: putchar('j');break;
        case 20: putchar('k');break;
        case 21: putchar('l');break;
        case 22: putchar('m');break;
        case 23: putchar('n');break;
        case 24: putchar('o');break;
        case 25: putchar('p');break;
        case 26: putchar('q');break;
        case 27: putchar('r');break;
        case 28: putchar('s');break;
        case 29: putchar('t');break;
        case 30: putchar('u');break;
        case 31: putchar('v');break;
        case 32: putchar('w');break;
        case 33: putchar('x');break;
        case 34: putchar('y');break;
        case 35: putchar('z');break;
        }
}
int printNumWithBase(int num, int base){
    int r = num % base;
    int q = num / base;
    if(q)
        printNumWithBase(q, base);
    printNum(r);
}

int main(void){
    int base = 10;
    int num1, num2, sum;

    base = inputNumWithBase(10);
    num1 = inputNumWithBase(base);
    num2 = inputNumWithBase(base);
    sum = num1 + num2;
    printNumWithBase(sum, base);

    return 0;
}

答案 1 :(得分:0)

我不确定如何在不使用字符串或数组的情况下执行此操作,因为正如Hans所指出的那样,strtol函数是一个很好的起点。它使用字符指针操作。 鉴于您的问题需要您解释实际上是字符串的字符,您可能会被要求自己实现strtol函数。

我的建议是从scanf和strtol函数开始,并尝试首先解决问题,而不是要求在课堂外可能不存在的问题的异常解决方案。