高级语言课程设计报告第二次报告:枚举的优化

 

实习题目

第二次报告: 枚举的优化

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.\n", 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",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排列整除

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

posted @ 2017-02-19 20:12  拓海藤原  阅读(251)  评论(0编辑  收藏  举报