zoukankan      html  css  js  c++  java
  • 循环结构程序设计

    尽量缩短变量的定义范围

    四舍五入(把一个单位区间往左移动了0.5个单位的距离)

    进行浮点数比较时,考虑浮点误差
    #include<stdio.h>
    #include<math.h>
    int main()
    {
        for(int a = 1; a <= 9; a++)
            for(int b = 0; b <= 9; b++) {
                int n = a*1100 + b*11;  // 尽量缩短变量的定义范围
                int m = floor(sqrt(n) + 0.5);  // 四舍五入,把一个单位区间往左移动了0.5个单位的距离
                if(m*m == n)  // 进行浮点数比较时,考虑浮点误差
                    printf("%d
    ", n);
            }
        return 0;
    }

    算数运算溢出 

    int32: -2147483648~2147483647

    #include<stdio.h>
    int main()
    {
        int n, count = 0;
        scanf("%d", &n);
        while(n > 1) {
            if(n % 2 == 1)
                n = n*3+1;
            else
                n/=2;
            count++;  // 计数器
        }
        printf("%d
    ", count);
        return 0;
    }

    long long -2^63~2^63-1 cin/cout

    #include<stdio.h>
    int main()
    {
        int n2, count = 0;
        scanf("%d", &n2);
        long long n = n2;
        while(n > 1) {
            if(n % 2 == 1)
                n = n*3+1;
            else
                n/=2;
            count++;  // 计数器
        }
        printf("%d
    ", count);
        return 0;
    }

    奇偶项

    #include<stdio.h>
    int main() {
        double sum = 0;
        for(int i = 0; ; i++) {
            double term = 1.0 / (i*2+1);
            if(i % 2 == 0)  // 奇偶项
                sum += term;
            else
                sum -= term;
            if(term < 1e-6)
                break;
        }
        printf("%.6f", sum);
        return 0;
    }

    末六位

    #include<stdio.h>
    int main()
    {
        int n, S = 0;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) {
            int factorial = 1;
            for(int j = 1; j <= i; j++)
                factorial *= j;
            S += factorial;
        }
        printf("%d
    ", S % 1000000);  // 末六位
        return 0;
    }
    要计算只包含+、-、*的整数表达式 / n的余数,可以在每步计算之后对n取余,结果不变
    计时函数clock(),返回程序目前为止运行的时间 / CLOCKS_PER_SEC以s为单位
    避免输入数据的时间影响测试结果——管道
    Windows: echo 20 | test.c
    Linux:       echo 20 | ./test.c
    程序效率低下!!!
    #include<stdio.h>
    #include<time.h>
    int main()
    {
        const int mod = 1000000;
        int n, S = 0;
        scanf("%d", &n);
        for(int i = 1; i <= n; i++) {
            int factorial = 1;
            for(int j = 1; j <= i; j++)
                factorial = (factorial * j % mod);  // 要计算只包含+、-、*的整数表达式 / n的余数,可以在每步计算之后对n取余,结果不变
            S = (S + factorial) % mod;
        }
        printf("%d
    ", S);
        printf("Time used = %.2f
    ", (double)clock() / CLOCKS_PER_SEC);  // 计时函数clock(),返回程序目前为止运行的时间 / CLOCKS_PER_SEC以s为单位
        return 0;
    }
    输入的个数不确定
    结束输入:Windows: Enter-->Ctrl+Z-->Enter
         Linux: Ctrl+D
    #include<stdio.h>
    int main()
    {
        int x, n = 0, min, max, s = 0;
        while(scanf("%d", &x) == 1) {  // 输入的个数不确定
            s += x;
            if(x < min)
                min = x;
            if(x > max)
                max = x;
            n++;
        }
        printf("%d %d %.3f
    ", min, max, (double)s/n);
        return 0;
    }

    了解文件读写的相关规定 

    文件输入输出:输入输出重定向,不能同时读写文件和标准输入输出

    freopen("input.txt", "r", stdin);
       freopen("output.txt", "w", stdout);

    文件比较:Windows: fc

           Linux: diff

    #define LOCAL
    #include<stdio.h>
    #define INF 1000000000
    int main()
    {
    #ifdef LOCAL  // 条件编译
        freopen("data.in", "r", stdin);
        freopen("data.out", "w", stdout);
    #endif
        int x, n = 0, min = INF, max = -INF, s = 0;
        while(scanf("%d", &x) == 1) {
            s += x;
            if(x < min)
                min = x;
            if(x > max)
                max = x;
        /*
            printf("x = %d, min = %d, max = %d
    ", x, min, max);
        */
            n++;
        }
        printf("%d %d %.3f
    ", min, max, (double)s/n);
        return 0;
    }

    在编译选项里定义LOCAL

    文件输入输出,禁止重定向,fopen可以反复打开并读写文件

    #include<stdio.h>
    #define INF 1000000000
    int main()
    {
        FILE *fin, *fout;
        fin = fopen("data.in", "rb");
        fout = fopen("data.out", "wb");
        int x, n = 0, min = INF, max = -INF, s = 0;
        while(fscanf(fin, "%d", &x) == 1) {
            s += x;
            if(x < min)
                min = x;
            if(x > max)
                max = x;
            n++;
        }
        fprintf(fout, "%d %d %.3f
    ", min, max, (double)s/n);
        fclose(fin);
        fclose(fout);
        return 0;
    }

    改成标准输入输出,不要调用fopen和fclose

    fin = stdin;
    fout = stdout;

    多组数据

    鲁棒性,在数据有瑕疵的情况下仍然给出正确的结果
    #include<stdio.h>
    #define INF 1000000000
    int main()
    {
        int x, n = 0, min = INF, max = -INF, s = 0, kase = 0;  // 当前数据编号
        while(scanf("%d", &n) == 1 && n) {  // 鲁棒性,在数据有瑕疵的情况下仍然给出正确的结果
            int s = 0;
            for(int i = 0; i < n; i++) {
                scanf("%d", &x);
                s += x;
                if(x < min)
                    min = x;
                if(x > max)
                    max = x;
            }
            if(kase)
                printf("
    ");
            printf("Case %d: %d %d %.3f
    ", ++kase, min, max, (double)s/n);
        }
        return 0;
    }

    编译选项-Wall给出警告信息

  • 相关阅读:
    和菜鸟一起学linux之bluetooth学习记录基础知识
    教父马云的经典语录汇总
    win32 多线程基础
    自己收集整理的微软错误代码大全(中文和英文)
    如何解决数据库中的字符型字段值中包含'0A'时,导出的文件用EXECEL打开时行数变多或者将结果导入数据库出错
    win32 TCP网络文件传输服务器端1.23
    Android窗口管理服务WindowManagerService对窗口的组织方式分析
    和菜鸟一起学linux总线驱动之DMA传输
    win 32下c语言文件传输客户端1.23
    Resolution to the record count increasing of the file exported from DB when ‘0A’ is included in it
  • 原文地址:https://www.cnblogs.com/protein-yunsheng/p/12693018.html
Copyright © 2011-2022 走看看