zoukankan      html  css  js  c++  java
  • 高级语言课程设计报告第二次报告:枚举的优化

     

    实习题目

    第二次报告: 枚举的优化

    l 阅读群文件《程序设计导引及在线实践》8章枚举之8.18.28.4

    l 对于8.2题,可否继续改进?试用DevC++编写运行改进版程序,并描述你的改进算法,并贴上代码及注释。

    l 完成ACM俱乐部作业:2015cup实习2枚举的优化

    l 描述你的算法,注释你的程序。

    l 注意勿抄袭:全系统自动判定抄袭,一旦抄袭,0分。

    一、实习目的:深入学习枚举的优化

    二、要求描述8.2,8.4题的解题算法对你的启发,8.2例题的算法有无可改进之处?描述你的改进算法,并贴上代码及注释。

    启发:尽量减少计算量,增大每一次循环的跨度,从而减少循环次数;利用数学公式推导,使已知量的关系更加直接,避免每次的重复计算。

    三、针对你的每一道题目:

    1.算法描述。

    直角三角形数量:通过对直角三角形的深度了解,可将其边的范围进一步缩小,进而减少计算量,比如最长的边的长度是周长的二分之一到三分之一之间,大大减小了计算量,而第二长的边必然大于其和最小边的和的二分之一,且小于最大边,减少了计算量。

    0~9排列整除:直接通过for   if 的重复,一个一个的比并没有太大的计算量,直接通过了。

    2.你的代码及注释。

    8.2优化:

    #include <stdio.h>

     int main()

     {

     int p,e,i,d,j,no=1;

     scanf("%d %d %d %d", &p, &e, &i, &d);

      while(p!=-1 && e!=-1 && i!=-1 && d!=-1)

       {

        j=(33-(d+1-i)%33)+d+1;        /*不用循环,减少循环,同时将33前移先运算*/

        for( ; j<21252; j=j+33)

         if ((j-e)%28==0)

            break;

        for( ; j<21252; j=j+33*28)      /*33*28数值相对较大*/

          if ((j-p)%23 == 0)

            break;

     printf("Case %d", no);

     printf(": the next triple peak occurs in %d days. ", j-d);

     scanf("%d%d%d%d", &p, &e, &i, &d);

     no++;

       }

     }

     

    直角三角形数量

    #include<stdio.h>

    int main()

    {

       int t,A,a,b,c,n,i; //A为周长

        scanf("%d",&t);

    getchar();

        while(t) //测试次数

        {

            n=0;

            scanf("%d",&A);

            for(c=(A/2);c>(A/3);c--) //最大边限制

            {

                for(b=((A-c)/2);b<c;b++) //第二边限制

                {

                    a=A-b-c;

                    if(b*b+a*a==c*c&&a<b) //判断

                    {      

                     n++;

                 }

                }

            }

        printf("%d ",n);

       t--;

    }

    return 0;

    }

     

    0~9排列整除

    #include <stdio.h>

    int main()

    {

    int a,b,c,d,e,f,g,h,i,j,n=0;

    for(a=0;a<10;a++) //每个都从零开始for

    {

    for(b=0;b<10;b++)

    {

    if(b==a) //分别与前一个比较

    continue;

    for(c=0;c<=9;c++)

    {

    if(c==a||c==b)

    continue;

    for(d=0;d<=9;d++)

    {

    if(d==a||d==b||d==c)

    continue;

    for(e=0;e<=9;e++)

    {

    if(e==a||e==b||e==c||e==d)

    continue;

    for(f=0;f<=9;f++)

    {

    if(f==a||f==b||f==c||f==d||f==e)

    continue;

    for(g=0;g<=9;g++)

    {

    if(g==a||g==b||g==c||g==d||g==e||g==f)

    continue;

    for(h=0;h<=9;h++)

    {

    if(h==a||h==b||h==c||h==d||h==e||h==f||h==g)

    continue;

    for(i=0;i<=9;i++)

    {

    if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)

    continue;

    for(j=0;j<=9;j++)

    {

    if(j==a||j==b||j==c||j==d||j==e||j==f||j==g||j==h||j==i)

    continue;

    if((a*10000+b*1000+c*100+d*10+e)%(f*10000+g*1000+h*100+i*10+j)==0) //判断是否整除

    n++;

    }

    }

    }

    }

    }

    }

      }

    }

    }

    }

    printf("%d",n);

    return 0;

    }

     

    3. 设计及调试过程遇到的问题及解决方案。

     直角三角形数量

        并不了解主要的优化方案,自己瞎想,始终想不出来怎么回事,无奈只好参考别人的思路,看了好几个都不太能理解,甚至看不懂为什么这样做,在看了几种思路后学会了其中好理解的几种,挑选最简易的编写。

    0~9排列整除

        毫无困难,顺着思路一次性编写成功。

    1. 心得体会和自我对程序的评价。

    直角三角形数量

        感觉自己的智商捉急啊,或许是不熟悉,或许就是想不到那种方法,不过我觉的还需要积累经验,看的多了,就会的多了。程序并不难,就是算法不好想。

     0~9排列整除

        没什么想说的就是以后可以用这样的方法编程。

  • 相关阅读:
    【SICP练习】80 练习2.52
    【SICP练习】79 练习2.51
    【SICP练习】78 练习2.50
    【SICP练习】77 练习2.48-2.49
    【SICP练习】76 练习2.47
    【SICP练习】75 练习2.46
    【SICP练习】74 练习2.45
    【SICP练习】73 练习2.44
    【SICP练习】72 练习2.43
    【SICP练习】71 练习2.42
  • 原文地址:https://www.cnblogs.com/xukaiae86/p/6416849.html
Copyright © 2011-2022 走看看