求解一道C语言基础编程题。。
发布网友
发布时间:2022-04-30 00:30
我来回答
共3个回答
热心网友
时间:2022-06-27 06:03
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));
}
热心网友
时间:2022-06-27 06:03
举个例子你就懂了,以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;
}
热心网友
时间:2022-06-27 06:04
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));
}