第2章 循环结构程序设计

2.1 for 循环


2.2 while 循环和 do-while 循环


2.3 循环的代价

  • windows 下的的管道输入

    echon|程序名

    n 是要输入的值

  • Linux 下的管道输入

    echon|./程序名


2.4 算法竞赛中的输入输出框架

  • 结束输入的方式:

    • Windows: Enter, Ctrl+Z, Enter
    • Linux: Ctrl+D
  • 文件比较命令:

    • Windows: fc
    • Linux: diff
  • 输入输出重定向:

    在 main 函数的入口加入下面两条语句(文件名不允许使用绝对或相对路径)

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    
  • 本机使用文件重定向,上交时删除的方法:

    #define LOCAL //提交时删除这一行
    #include <stdio.h>
    int main() {
          #ifdef LOCAL
          //本机执行的语句,如文件重定向
          #endif
          //...其他语句   
    }
    

    也可以在编译选项中定义 LOCAL 符号而不是在代码中,这样更不容易出错。

    方法是在编译选项中加入-DLOCAL

  • 使用文件输入输出,但不使用重定向的方式:

    int main() {
          FILE *fin, *fout;
          fin = fopen("data.in", "rb");   //rb 是二进制读方式打开文件
          fout = fopen("data.out", "wb"); //wb 是二进制写方式打开文件
          //如果想改成标准输入输出,令 fin = stdin, fout = stdout, 且不写 fclose 语句即可
          int x;
          while(fscanf(fin, "%d", &x) == 1) {
              //输入语句使用 fscanf,第一个参数是输入文件,后面的参数和 scanf 相同
              //...
          }
          fprintf(fout, "%d", x);
          fclose(fin);
          fclose(fout);   //最后应当关闭输入输出文件
          return 0;   
    }
    
  • 鲁棒性(robustness)

    可以理解成程序的健壮性或稳定性

  • 编译选项 -Wall 可以打出编译警告


2.5 注解与习题(python 实现)

  1. 水仙花数(三位数)

    for i in range(100, 1000):
        a = int(i / 100)
        b = int(i % 100 / 10)
        c = int(i % 10)
        if a*a*a + b*b*b + c*c*c == i:
            print(i)
    
  2. 韩信点兵:士兵以三人一排,五人一排,七人一排的队形排列

    输入中包含多组数据,每组数据包含三个非负整数 a, b, c,表示每一种队形排尾的人数(a<3, b<5, c<7),输出总人数的最小值或报告无解。已知总人数不小于10,不超过100

    import sys
    
    for line in sys.stdin:
        # 作用等同于 while(cin)
        # split() 函数默认分隔符是空格
        a, b, c = line.split()[:3]
        a = int(a)
        b = int(b)
        c = int(c)
        for x in range(10, 101):
            if int(x % 3) == a and int(x % 5) == b and int(x % 7) == c:
                print(x)
                break
            elif x == 100:
                print('no answer')
    
  3. 倒三角形

    n = int(input())
    
    for i in range(n):
        for blank in range(i):
            print(' ', end="")
        for sharp in range(2*(n-i)-1, 0, -1):
            print('#', end="")
        if i != n-1:
            print("")
    
  4. 子序列的和

    import sys
    
    for line in sys.stdin:
        n, m = line.split()[:2]
        n = int(n)
        m = int(m)
        if n == 0 and m == 0:
            break
        else:
            result = 0.0
            while n <= m:
                result += 1 / (n * n)
                n += 1
            print("%.5f" % result)
    
  5. 分数化小数:输出 a/b 保留 c 位小数的结果

    import sys
    
    for line in sys.stdin:
        a, b, c = line.split()[:3]
        a = int(a)
        b = int(b)
        c = int(c)
        if not a and not b and not c:
            break
        else:
            formatStr = "%%.%df" % c
            print(formatStr % (a/b))
    
  6. 排列:使用1-9组成 abc, def, ghi 三个数并输出,要求三个数的比值为1:2:3,每个数字仅使用一次

hash = [0] * 10
hash[0] = 1

def check(x):
a = int(x / 100)
b = int(x / 10 % 10)
c = int(x % 10)
if a != b and b != c and a != c and not hash[a] and not hash[b] and not hash[c]:
hash[a] = hash[b] = hash[c] = 1
return True
else:
return False

for x in range(123, 330):
hash = [0] * 10
hash[0] = 1
if check(x) and check(x+x) and check(x+x+x):
print(x, x+x, x+x+x)
```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容