首页 > 代码库 > 高级语言课程设计报告第二次报告:枚举的优化
高级语言课程设计报告第二次报告:枚举的优化
实习题目 |
第二次报告: 枚举的优化 l 阅读群文件《程序设计导引及在线实践》8章枚举之8.1,8.2,8.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排列整除:
毫无困难,顺着思路一次性编写成功。
- 心得体会和自我对程序的评价。
直角三角形数量:
感觉自己的智商捉急啊,或许是不熟悉,或许就是想不到那种方法,不过我觉的还需要积累经验,看的多了,就会的多了。程序并不难,就是算法不好想。
0~9排列整除:
没什么想说的就是以后可以用这样的方法编程。
高级语言课程设计报告第二次报告:枚举的优化