今天上英语课,突然想到了之前在论坛上看到的一个问题:如何用一个变量打印出九九乘法表,当时看了贴里的回复,有人说九九乘法表是固定的,何必用变量,然后就手打了一个。
然后在下面看到一个真的用单个变量打印出九九乘法表的,但表示真心看不懂。。。
但是在这贴里,我还是学到了一个重要思想,里面有人说了一句,把一个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;
}
试试吧