171023—各进制数输出:二进制转换&用格式控制符输出八,十,十六进制数

插一句:昨天做的“剪刀石头布”忘掉了双方出同一种(即平局)的可能。只需在原有的if …else语句之中再内嵌一个if就好。

正文

原题:输出一张数表,内容是1~126各个数字的十进制,二进制,八进制,十六进制。
初生牛犊啊。。第一反应是:这个计算机应该会自己做吧?我用那什么叫啥来着。。格式控制符就好了吧?

一翻书,格式控制符有是有。。只有十进制(dec),八进制(oct),十六进制(hex)。没有二进制,考虑到二进制的英文单词(binary)。。1.鸡贼一下,不会是有bin没写出来吧??
2.而且,这个控制符可以实现直接将十进制数按我想要的格式输出吗?

尝试了一下,对于书上给出的三种控制符,只要有个数,都可以直接通过编程时写进来实现各种数制的输出。

    int a;
    cout<<dec<<a<<endl;
    cout<<oct<<a<<endl;
    cout<<hex<<a<<endl;

而臆想出来的bin。。也显然不存在,果断在编译的时候就会报错。
问题到这里已经解决了3/4。但剩下的那1/4现在才是重要的:

怎样把一个十进制数转变为二进制数输出?

这个问题,如果手动进行的话,思路明了,对任意的n除2做带余除法,逆向取余即可得其二进制数。
但初步考虑至少有两个问题难以解决:

  • 你怎么知道会做多少步呢?你不知道,就不好找一个合适的变量(或者说足够多的变量)来储存每步得到的余数
  • 怎么逆向输出这些存下来的数?

可以看出来。以上所谓初步考虑基于这样一个假设:按从后至前的顺序输出一串由多步带余除法之后得到的余数。
问天问地问自己:见过么?没见过。。学过么?没学过。。那怎么写。。?

问度娘,看了好几个版本,满篇不认识的函数。
瞎翻书。书上有个例题,是把二进制转换成十进制。它用的方式是按从右到左的顺序读取输入的一个二进制数的各位字符,将各位乘上对应的权重,然后累加,即有结果。
初看感觉对我的问题没什么启发,因为移位读取我不会用,其次移位读十进制数。。。别逗了。

但仔细想了想,那个累加好像可以解决刚才自己想到的问题。。
再稍微鸡贼下。。所谓逆向取余法。各个余数可是直接按数位排序,而不是加和啊。。
我难道非要用“二进制表示的数”来表示一个数的二进制吗?
如果我用十进制思维去表示呢?
逆向取余法有一个特点,最先得到的余数在最后的示数中是最低位。这样的话,如果用累加的方式,就很方便了。
如果我把每次得到的余数乘上一个如果它处在一个十进制数中该有的权重。再逐个累和。不就能的到一串1,0组合成的数字了吗?这串数字在计算机看来还是十进制数,因为它是由常规的十进制运算方式得到的,
它也不是一串仅仅由1,0按一定顺序排列得到的字符串(最先考虑的解决方案)。
它是个数字,是个人看来可以理解为二进制的东西。

talk is cheap,show me the code..

这里写图片描述
这里为了达到每一步都清晰的效果,最大程度地碎化了各个步骤,并且毫不考虑变量的数量。(此举使学长hin不爽。。)
思路确定之后写的时候感觉前几天写循环语句时积累的经验十分有用,比如,各语句该放的先后顺序,选择合适的计数器以及循环判断条件。。etc。

运行结果很棒。

但我们还是不能忘初心的对吧。原题还是要组合起来解决掉。
其实现在剩下的问题也就是选一个循环结构,然后把几个语句的顺序做调整(就像扯线子拧螺丝把几台设备连接起来调试一样)
原码:

#include<iostream>
using namespace std;
int main()
{
 cout<<"decimal"<<'\t'<<'\t'<<"binary"<<'\t'<<'\t'<<"cotal"<<'\t'<<'\t'<<"hexadecimal"<<endl;
 int d;
 int n,m,s,t,q,x; //光为了计算这个二进制数,就定义了5个变量。 
 for(d=1;d<=126;d++)
 {
    s=0;t=1;n=d;//还记得第一次用累加器的时候给初值时它的位置吧? 
    do
    {
        m=n%2;
        x=n/2;
        q=m*t;//t是以10为阶的示数权重 
        s=s+q;//s充当累加器 
        t=t*10;
        n=x;
    }while(x>0);

    cout<<dec<<d<<'\t'<<'\t'<<s<<'\t'<<'\t'<<oct<<d<<'\t'<<'\t'<<hex<<d<<endl;

 }
}

因为内容的多。。这次成了有史以来写过的最胖的代码。。看着很充实{笑哭。。}
留张图吧:
这里写图片描述

P.S:
有感:

  • 编程真正难的地方根本不是编程语言自己要求的语法,书写规范这类东西。而是,你怎么把一个问题抽象出来,用合适的方式表示它,合适的模型描述它,怎么考虑各种不同情况,并把他们用一个合适的结构组合起来,各部放在该有的位置,让其不会出错。这里有时候你会引入很多在原问题里看不出来的量(比如为配合while判断语句时)。我想这才是所谓的编程能力和它对人的思维的锻炼所在。
  • 在作出这个东西之前,我作出过其他几个东西,在作出那些东西之前,我觉得这个东西好难,没思路,但思考一会,尝试几次,修改几回。自己也能作出想要的结果。但这次的困难让自己觉得无法克服(特别是百度了几种发现完全看不懂之后),让自己觉得这个凭自己现在的知识能力不可能完成,这不是借口吧?这是事实哎。。我没学过。但硬着头皮做下去之后,发现也能成了。并不是说我自己有多厉害。而是说:对待自己初次遇到的,看不出思路的问题,别那么快放弃。坚持一会,或许就成了。

这是我学习编程两周后的感触,存在这里。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值