高级语言课程设计报告
实习题目 |
第六次报告: 模拟 l 完成ACM俱乐部作业:2015cup实习6模拟中至少1道 l 描述你的算法,注释你的程序。 l 注意勿抄袭:全系统自动判定抄袭,一旦抄袭,0分。 |
一、实习目的:熟练编程的算法及逻辑,了解不同题型的解法。
二、针对你的每一道题目:
李白打酒:
1.算法描述。
确定最后两次肯定是喝酒后,进行13次循环每次循环两次分别进行两种情况,这样遍历每一种情况,然后用条件限制不行的情况,最后输出符合的情况。
2.你的代码及注释。
#include <stdio.h>
int main()
{
int a[16],b[16],c=0,d=0,e,f=0,g=0;
a[0]=2;
for(b[0]=0;b[0]<2;b[0]++) //第一次动作
{
if(b[0]==0)
{
a[1]=a[0]*2;
c++;
}
else
{
a[1]=a[0]-1;
d++;
}
for(b[1]=0;b[1]<2;b[1]++) //第二次动作
{
if(b[1]==0)
{
a[2]=a[1]*2;
c++;
}
else
{
a[2]=a[1]-1;
d++;
if(a[2]==0) //判断酒量
break;
}
for(b[2]=0;b[2]<2;b[2]++) //第三次动作
{
if(b[2]==0)
{
a[3]=a[2]*2;
c++;
}
else
{
a[3]=a[2]-1;
d++;
if(a[3]==0) //判断酒量
break;
}
for(b[3]=0;b[3]<2;b[3]++) //第四次动作
{
if(b[3]==0)
{
a[4]=a[3]*2;
c++;
}
else
{
a[4]=a[3]-1;
d++;
if(a[4]==0) //依然判断酒量
break;
}
for(b[4]=0;b[4]<2;b[4]++) //第五次
{
if(b[4]==0)
{
a[5]=a[4]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[5]=a[4]-1;
d++;
if(a[5]==0) //依然判断酒量
break;
}
for(b[5]=0;b[5]<2;b[5]++) //第六次
{
if(b[5]==0)
{
a[6]=a[5]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[6]=a[5]-1;
d++;
if(a[6]==0) //依然判断酒量
break;
}
for(b[6]=0;b[6]<2;b[6]++) //第七次
{
if(b[6]==0)
{
a[7]=a[6]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[7]=a[6]-1;
d++;
if(a[7]==0) //依然判断酒量
break;
}
for(b[7]=0;b[7]<2;b[7]++) //第八次
{
if(b[7]==0)
{
a[8]=a[7]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[8]=a[7]-1;
d++;
if(a[8]==0) //依然判断酒量
break;
}
for(b[8]=0;b[8]<2;b[8]++) //第9次
{
if(b[8]==0)
{
a[9]=a[8]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[9]=a[8]-1;
d++;
if(a[9]==0) //依然判断酒量
break;
}
for(b[9]=0;b[9]<2;b[9]++) //第10次
{
if(b[9]==0)
{
a[10]=a[9]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[10]=a[9]-1;
d++;
if(d==10) //共喝了10次
continue;
if(a==0) //依然判断酒量
break;
}
for(b[10]=0;b[10]<2;b[10]++) //第11次
{
if(b[10]==0)
{
a[11]=a[10]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[11]=a[10]-1;
d++;
if(d==10) //共喝了10次
continue;
if(a==0) //依然判断酒量
break;
}
for(b[11]=0;b[11]<2;b[11]++) //第12次
{
if(b[11]==0)
{
a[12]=a[11]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[12]=a[11]-1;
d++;
if(d==10) //共喝了10次
continue;
if(a[12]==0) //依然判断酒量
break;
}
for(b[12]=0;b[12]<2;b[12]++) //第13次
{
if(b[12]==0)
{
a[13]=a[12]*2;
c++;
if(c==5) //总共打酒5次
continue;
}
else
{
a[13]=a[12]-1;
d++;
if(d==10) //共喝了10次
continue;
if(a[13]==0) //依然判断酒量
break;
}
a[14]=a[13]-1; //第14次
b[13]=1;
a[15]=a[14]-1; //第15次
b[14]=1;
for(e=0;e<15;e++) //数有几次成立
if(b[e]==0) g++;
if(a[15]==0&&g==5) //成功就+1
{
f++;
}
g=0;
}
}
}
}
}
}
}
}
}
}
}
}
}
printf("%d",f); //输出个数
}
3. 设计及调试过程遇到的问题及解决方案。
问题大概就是开始时如果某种情况不行要返回时出了问题,后来使用数组记录的每一步的酒量就省去了返回这一步,其次就是条件的设定总是出错,经过多次debug后终于成功。也是挺费劲的。
- 心得体会和自我对程序的评价。
我感觉这个完全不用我这么麻烦,直接用一个递归就行了,不用这么长,但是毕竟不习惯,就费了很大的劲复制粘贴,大的改了两次,就是因为酒量返回不了,不错的题目,相信下次在遇到我会试着用递归的方法。
十六进制转十进制:
1.算法描述。
直接用%x输入。用%ld输出。此题bug在此。
2.你的代码及注释。
#include <stdio.h>
int main()
{
long int a;
scanf("%x",&a);
printf("%ld",a);
}
3. 设计及调试过程遇到的问题及解决方案。
此题需要long int,这是重点,不然答案错误。
4.心得体会和自我对程序的评价。
我是不是有点太机智了。求老师放过。555555
约瑟夫:
1.算法描述。
2.你的代码及注释。
3. 设计及调试过程遇到的问题及解决方案。
4.心得体会和自我对程序的评价。