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

这里写图片描写叙述

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

这里写图片描写叙述

可是在这贴里,我还是学到了一个重要思想,里面有人说了一句。把一个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;
}

这里写图片描写叙述
试试吧