单个变量打印九九乘法表

今天上英语课,突然想到了之前在论坛上看到的一个问题:如何用一个变量打印出九九乘法表,当时看了贴里的回复,有人说九九乘法表是固定的,何必用变量,然后就手打了一个。

这里写图片描述

然后在下面看到一个真的用单个变量打印出九九乘法表的,但表示真心看不懂。。。

这里写图片描述

但是在这贴里,我还是学到了一个重要思想,里面有人说了一句,把一个8位内存拆成两半用,哎,我觉得这个还是挺有意思的,一直记着这句话。今天突然回想到这个问题,那就做做:
首先是申请一个内存,8为的话拆成两半刚好,如果是16位,则拆成12和4两部分,32则拆成28和4两部分,不是真拆,只是一个思维而已,其实只是把内存当成两部分来用,只用到了前8位,这8位分为高4位和低4位。
接下来研究下高四位,高四位每进1是加16,从0x00开始,没加一次16它就增一(例如:0x00+0x10=0x10、0x10+0x10=0x20、0x20+0x10=0x30),如此,加9次就等于0x90,用以下代码不就可以打印1到9了吗

for (i >> 4; i < 0xa0; i += 0x10);

在接着得内嵌一个for循环(平时用两个变量打印两个九九乘法表也是这么做的吧),这一步比较难,我们想一想,九九乘法表是不是第几行就有几列,行数和列数总是相同,如过打印的是第七行,那外循环是加多少次0x10,7次吧,那就是7个16咯,那是不是可以用0x70/0x10来的到7,一样的,打印第5行就是0x50/0x10,行数是多少就打印多少列,每打印一次就自增一,那问题就来了,内嵌for循环的判断条件的是什么呢??
怎么每次i自增一后还能判断目前所打印的列数是不是小于行数呢,是不是可以用求余的方法啊,前面是0x10的倍数,后面再增多少求余后不就余多少了吗!所以以下代码打印列:

for (; i % 0x10 < (i / 0x10); ++i);

但是内嵌的这个for循环执行完后i岂不是每次都会增加相应行数,那接下来的循环不就麻烦啦,所以每次内嵌的for循环执行完后,i都得减去相应的行数:

i -= (i % 0x10);

以下是用单个变量打印九九乘法表的代码:

#include<iostream>
int main()
{
    for (int i = 0x00; i < 0xa0; i += 0x10) {
        for (; i % 0x10 < (i / 0x10); ++i) {
            std::cout << i % 0x10 + 1 << "*" << i / 0x10 << "="
                << (i % 0x10 + 1)*(i / 0x10) << "\t";
        }
        std::cout << std::endl;
        i -= (i % 0x10);
    }
    std::cin.ignore();
    return 0;
}

这里写图片描述
试试吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值