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

2024-11-28 02:38:45
推荐回答(3个)
回答(1):

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
/* //以上语句等于如下形式,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));

}

回答(2):

举个例子你就懂了,以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
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{
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;
}

回答(3):

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; jsum += 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));
}