这部分只是我计划中的一小部分,但希望我能独自管理其他部分。
代码应该使用不同的数字基数,所以让我们在中间切开并假设我们有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)有多长,但是当涉及带字母的数字时,我不能这样做。
答案 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.
编辑: - 以下是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);
}