zoukankan      html  css  js  c++  java
  • 单个变量打印九九乘法表

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

    这里写图片描写叙述

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

    这里写图片描写叙述

    可是在这贴里,我还是学到了一个重要思想,里面有人说了一句。把一个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) << "	";
            }
            std::cout << std::endl;
            i -= (i % 0x10);
        }
        std::cin.ignore();
        return 0;
    }

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

  • 相关阅读:
    Spring MVC异常处理
    Spring MVC 数据校验
    Spring MVC 拦截器(Interceptor)
    Spring MVC 表单标签库
    Spring MVC 数据格式化(Formatter)
    Spring MVC 类型转换器(Converter)
    Spring MVC @ModelAttribute注解
    Spring MVC @Autowired和@Service注解
    如何在Storyboard中使用Scroll view
    学好Python的五本书
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7278105.html
Copyright © 2011-2022 走看看