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

求解一道C语言基础编程题。,第1张

首先看一下程序的逻辑(虽然貌似题主应该不是在这一块有问题:

关于ascii码的解释:

首先得知道每个字符和数值的对应关系(图不清晰可看戳这里:ascii编码对应表

好了,现在看程序中的第一个if语句,在用大于、小于这些镇绝悔运算比较符比较char的时候,会自动转换为整数比较,也就是说‘0’会转换成48,‘1’转换成49……以此类推,最后是‘9’转换成57,你会发现把这些char减去48就会得到它们各自相对应的整数数值,这就是第一个if里面减去48的目的。同理,接下来的else-if语句,‘A’到‘F’也会转换成整数数值,具体对应的数值可以参看ascii表,一样的道理减去‘A’然后加10的目的也是转换成数值,因为在大于10的进制下,A代表10,B代表11……以此类推,因为这个程序最高就16进制了,所以判断到F就可以了。

然后我们来看进制的解释:

所谓进制,其实就是组合数字的方式,理解了这一点就很好说了。比如说10进制,为什么198等于198(好像很傻一问题)?其实是因宏并为在十进制下,198 (10) = 1 * 10^2 + 9 * 10^1 + 8 * 10^0 = 198(好像是这么回事,(。ì _ í。)),同一个数字,放在不同的位置,它所代表的分量也不一样,即组合数字的方式会影响数字的值,1后面还有2个数字,所以这个1实际上是1 * 10^2 = 100,而不是1,其它位置的数字同理,然后把这些值加起来,就得到了整个数字所代表的最终的值,因此我们才有了 198 = 198(好像很有道理)。

但是,198也可能不等于198,什么时候不等于呢?在不同的进制下。比如说假如我们的这个198是在16进制下的198,那么 198 (16) = 1 * 16^2 + 9 * 16^1 + 8 * 16^0 = 408 (10) = 408。

为什么会产生这种差别呢?因为16进制下的那个1代表的分量是1 * 16^2了,而不是1 * 10^2了,同理,在其它进制下只需要把乘的数字换成对应的进制的数就好了,比如在9进制下那个1就是1 * 9^2等等。

这样一来上面程序里面的for语句就好理解了,之所以用for是因为要算出次方(这个应该不用解释),一个数要乘的次方是它后面跟着的数字的个数,所以是“j = 0j <len - 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=0j<len-i-1j++) 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))

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12322803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存