求解一道C语言基础编程题。。

题目:编写程序,其中使用函数base完成以下功能:将输入的一个base(取值2到16)进制正整数转换为十进制数输出。整数base和要转换的以字符串str表示的base进制数由键盘输入。如,输入16 2A则表示输入16进制数2A,程序将输出十进制整数42;输入3 211则输出22。
这是答案:
int base(int k, char s[])
{
int len=0,sum=0;
int i,j,t,n;
while (s[len]!='\0') len++;
i=len-1;
while (s[i]!='\0')
{
n=0;
if (s[i]>='0'&&s[i]<='9')
n=s[i]-48;
else if (s[i]>='A'&&s[i]<='F')
n=10+s[i]-'A';
t=1;
for (j=0; j<len-i-1; j++) t=t*k;
sum += n*t;
i--;
}
return (sum);
}
main()
{
int sz;
char str[20];
scanf("%d %s",&sz,str);
if (sz<2||sz>16)
printf("输入错误。\n");
else
printf("%d\n",base(sz,str));
}
但是我看不懂呀,大佬能帮我写好详细注释吗?就比如这些进制转化的方法是怎样的?我真的不懂进制要怎样转化。

intbase(intk,chars[])//按定义,k是进制(2~16),s是输入的字符串

{

int len=0,sum=0; //len 指s字符串长度,sum指转换后的k进制数

int i,j,t,n;

while (s[len]!='\0') len++; //计算s数组长度,也就查看用户从键盘输入了多少字符

i=len-1; //从最高位开始,也就是从最右侧开始计算,比如s=1234ab,先从b开始计算

while (s[i]!='\0') //逐个读取字符串s,第i位的具体字符值,s[i]是否有效

{

n=0; //s[i]是字符(char),s[i]转换成10进制对应的值

if (s[i]>='0'&&s[i]<='9') //查ascii码表

n=s[i]-48; //48即字符 '0'

else if (s[i]>='A'&&s[i]<='F') //A--F用来代表10进制下的10~15

n=10+s[i]-'A'; //s[i]是字符(char),s[i]转换成10进制对应的值

t=1;

for (j=0; j<len-i-1; j++) t=t*k;

/* //以上语句等于如下形式,s[i]对应的倍率,假设k=10,就好理解

t=1; //个位,即i=len-1时

t=1*k; //十位 即i=len-2时

t=1*k*k; //百位

t=1*k*k*k; //千位

.....

*/

sum += n*t; //合计,个+十+百+千+...

i--;

}

return (sum);

}

main()

{

int sz;

char str[20];

scanf("%d %s",&sz,str);

if (sz<2||sz>16)

printf("输入错误。\n");

else

printf("%d\n",base(sz,str));

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-07-09
举个例子你就懂了,以16进制的2ABC为例,16进制转为10进制的方法,就是从右到左,依次用该位的数字乘以16的0次方、16的1次方、16的2次方(同样如果是其它进制,比如8进制,那就是8的0次方、1次方等等)。。之和,比如说2ABC转10进制,就等于
2ABC(16)=C*1+B*16+A*16*16+2*16*16*16
你上面这个代码就是模拟这个过程,从最后一位起,先将字符转为实际对应的数字,比如说输入的是2A,那么'A'对应的数字就是10+'A'-'A'=11,同样的'2'对应的数字就是'2'-'0'=2(或者'2'-48=2,48即'0'的ascii)得到的数字放在n里,然后用t来计算每一次该乘以多少(比如最后一位,t就是1,倒数第二位,t就是16,倒数第三位,t就是16*16),之后再通过sum+=n*t累加。

while (s[len]!='\0') len++; //通过循环获取长度,实际上在string.h里有strlen可以直接获取

i=len-1;

while (s[i]!='\0') { //循环开始

n=0;

if (s[i]>='0'&&s[i]<='9') //if else计算每一位实际对应的10进制数字

n=s[i]-48;

else if (s[i]>='A'&&s[i]<='F')

n=10+s[i]-'A';

t=1;

for (j=0; j<len-i-1; j++) t=t*k; //计算当前位应该乘以多少,比如i起始是len-1,那么j=0;j<len-i-1实际上就是j<0;没有循环,t为1,下一次循环i是len-2,j<len-(len-2)-1即为j<1,循环一次,t=1*16=16,同样,再下一次就是16*16

printf("****%d\n",t);

sum += n*t;//累加

i--;

}

不过这样写确实有些繁琐,也没啥必要,可以是

int base(int k,char s[])
{
int len=0,sum=0;
int i,n;
while (s[len]!='\0') len++;
for(i=0;i<len;i++)
{
if (s[i]>='0'&&s[i]<='9')
n=s[i]-48;
else if (s[i]>='A'&&s[i]<='F')
n=10+s[i]-'A';
sum=sum*k+n;
}
return sum;
}本回答被提问者采纳
第2个回答  2020-07-09
int base(int k, char s[])
{
int len=0,sum=0;
int i,j,t,n;

while (s[len]!='\0') len++;
i=len-1;
while (s[i]!='\0')
{
n=0;
if (s[i]>='0'&&s[i]<='9')
n=s[i]-48;
else if (s[i]>='A'&&s[i]<='F')
n=10+s[i]-'A';
t=1;
for (j=0; j<len-i-1; j++) t=t*k;
sum += n*t;
i--;
}
return (sum);
}
main()
{
int sz;
char str[20];

scanf("%d %s",&sz,str);
if (sz<2||sz>16)
printf("输入错误。\n");
else
printf("%d\n",base(sz,str));
}本回答被网友采纳