概述
第十九周课程设计总结
*1.第二题:
题意:输出所有在给定范围内(从m到n)的水仙花数,即满足如153=1^3+5^3+3^3关系的数,并输出。
解题思路:
先将该三位数的百位,十位,个位分别提取出来,然后判断百位十位个位各自三次方的加和是否与原来的三位数相等,若相等,则输出。
处理细节:
1.多组输入
2.输出之后应该换行,空格。
3.注意++s与s++并不相同,该部分不是在for循环内,应该特别注意。
#include<iostream>
#include<cstdio>
using namespace std;
int p[1000];//将数组定义在主函数的外面,就不用再初始化
int main()
{
int b=0,c=0,d=0,m,n,s=0;
while(cin>>m>>n)//多组输入
{
s=0;
for(int a=m;a<=n;a++)
{
b=a/100;//百位
c=a/10%10;//十位
d=a%10;//个位
if(a==b*b*b+c*c*c+d*d*d)//关系式
p[++s]=a;//++s与s++不同,不可以混淆
}
if(s==0)//若不含有水仙花数
cout<<"no"<<endl;
else
for(int i=1;i<=s;i++)
{
if (i==s)//数字与各个位数的三次方的乘积之和相等时输出
cout<<p[i]<<endl;
else
cout<<p[i]<<" ";
}
}
return 0;
}
*2.二十一题:
题意:
假设所有的短号都是是 6+手机号的后5位
(即,输入一串手机号,输出6+后五位数字。)
解题思路:
已知手机号固定有十一位,所以只要将第七位到第十一位数字输出即可。
细节处理:
1.定义多组输入,关键在于将十一位数字的后五位提取出来,然后输出。
#include<iostream>
using namespace std;
int main ()
{
int n,i;
char a[12];//定义数组
cin>>n;
while(n--)//倒序
{
for(i=1;i<=11;i++)
cin>>a[i];
cout<<6;
for(i=7;i<=11;i++)
cout<<a[i];//将第七位至第十一位数字输出
cout<<endl;
}
return 0;
}
*3.二十四题:
题意:求买菜所用的总钱数。等于求出每种菜的价钱后加和。
解题思路:数量乘单价相加求出买的菜的总价钱。因为价钱最小精确到角,所以保留一位小数。
细节处理:
1.注意所需头文件;
2.应用到了字符串来表示菜名;
3.本题要求精确到角,所以程序最后要将小数精确,用到了单位的换算。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
int main ()
{
double x,y,sum=0;
string s;//字符串表示菜名
while (cin>>s>>x>>y)
{
sum+=x*y;求单个的价钱,再相加
}
printf("%.1lfn",(sum*10+0.5)/10);//四舍五入,单位换算,使精确度为角
return 0;
}
*4.十九题:
题目:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
题意:找出蚂蚁所能通过的路线条数。
解题思路:只能向右行走,而不能向左行走,所以后面路线的条数与前面路线的条数是有关系的,即满足:a[i]=a[i-1]+a[i-2].
细节处理:
1.本题定义了long long,使用int并不能通过,是出现错误的主要地方;
2.首先要将第一步和第二部的路线数表示出来,因为后边需要用其来表示;
#include<iostream>
using namespace std;
int main()
{
long long c[100],a,b;//定义数组,定义变量
long long n,i,j=0;
cin>>n;
c[1]=1;//第一步所包含的路线条数
c[2]=2;//第二部所包含的路线条数
for(i=3;i<=50;i++)//从第三部开始,满足以下关系
c[i]=c[i-1]+c[i-2];
while(n--)
{
cin>>a>>b;
j=b-a;
cout<<c[j]<<endl;
}
return 0;
}
*5.第五题:
题意:设计程序求出多项式:1 - 1/2 + 1/3- 1/4 + 1/5 - 1/6 + ...的值。
解题思路:该多项式可以划分为两部分,第一部分是正值(1+ 1/3+ 1/5+……),即奇数项;第二部分是负值[-(1/2+ 1/4+……)],即偶数项。计算出各部分的加和之后再相减即可。
细节处理:
1.直接进行计算比较麻烦,将其拆成两部分比较容易计算。
2.保留两位小数。
程序算法如下:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
double m,n,i,s,sum,t,p,j;
cin>>m;
for(i=1;i<=m;i++)
{
cin>>n;
s=0;t=0;
for(p=1;p<=n;p+=2)//奇数项的加和
{
s+=1/p;
}
for(j=2;j<=n;j+=2)//偶数项的加和
{
t+=1/j;
}
sum=s-t;//输出各自的加和之后相减的结果
printf("%.2lfn",sum);//保留两位小数
}
return 0;
}
*6.第七题:
题意:每位选手的得分去掉一个最高分和一个最低分,然后计算平均得分;并保留两位小数。
解题思路:先定义出min和max,然后在循环过程中,找出比min小的值令min=该值,找出比max大的值,令max=该值。
细节处理:关键在于找出min和max的值
#include<stdio.h>
int main()
{
int n,i;
double sum,min,max;
double a[110]={0};
while(scanf("%d",&n)!=EOF)
{
sum=0;
if(n<3||n>100)
break;
for(i=0;i<n;i++)
{
scanf("%lf",&a[i]);
sum+=a[i];
}
min=a[0];//定义出min,max
max=a[0];
for(i=1;i<n;i++)
{
if(min>a[i])//找出比min小的数
min=a[i];//将该数赋值给min
if(max<a[i])//同上
max=a[i];
}
sum-=min;//去掉最小值
sum-=max;//去掉最大值,然后保留两位小数后输出结果
printf("%.2lfn",sum/(n-2));
}
return 0;
}
*7.第八题:
题目:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
解题思路:第一头母牛从第二年开始每年生一头小母牛,找出其规律
细节处理:
#include<iostream>
using namespace std ;
int main()
{
int n;
while(cin>>n)
{
if(n==0)//没有小牛时的情况
break;
int a,b,c,d;//分别表示一岁二岁三岁四岁的母牛
if(n<=4)//四年之内
cout<<n<<endl;
else//从第四年开始,第一头小牛开始生产
{
n=n-4;
a=b=c=d=1;
for(int i=0;i<n;i++)
{
d=c+d;//当年大母牛的数目为前一年c+d
c=b;//母牛长一岁到了c
b=a;//母牛长一岁到了b
a=d;//长成的母牛和以前的母牛生出的小牛总数
}
cout<<a+b+c+d<<endl;
}
}
return 0;
}
*8.第十二题:
题意:判断一个字符串是不是回文串。
解题思路:判断字符串是不是对称的形式,所以从头从尾进行判断
细节处理:
1.需要定义字符串 头文件;
2.如下陌生语句:reverse(S.begin(),S.end());正序倒序一块开始判断是否相同
#include <iostream>
#include <string>//字符串
#include <algorithm>//排序
using namespace std;
int main ()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string s;//输入该字符串
cin>>s;
string S=s;
reverse(S.begin(),S.end());//进行判断
if(S==s) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
*9.第十五题:
题意:A-B求两个集合的差,就是做集合的减法运算。即在A中减去两者相同元素,然后将剩余元素输出。
解题思路:先定义数组,然后分情况讨论,包括元素为零和不为零的情况
细节处理:
1.头文件的定义要注意
2.多组输入
3.a[i],b[i]的取值范围
4.需要进行排序处理
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main()
{
int n,m,a[150],b[150],k=1,count;
while(cin>>n>>m)
{
if(n==0&&m==0)//分情况讨论之n或m为零时
break;
for(int i=0;i<n;i++)
cin>>a[i];
for(int j=0;j<m;j++)
cin>>b[j];
sort(a,a+n);
sort(b,b+m);
count=0;//在输入之前进行初始化会更加精确
for(int i=0;i<n;i++)
{
k=1;
for(int j=0;j<m;j++)
{
if(a[i]==b[j])//找到A,B中相同的元素
{
k=0;
count++;
break;
}
}
if(k==1)
cout<<a[i]<<" ";
}
if(count==n)//结果为空集合时
printf("NULL");
cout<<endl;
}
return 0;
}
*10.第十七题:
题意:判断给定的两个数是否是亲和数,即判断这两个数其中一个数的真约数之和是否等于另一个数,反之亦然。
解题思路:分别求出两个数的真约数并加和,然后进行比较,比较是否相等,然后得出结果。
#include<iostream>
using namespace std;
int main()
{
int n,a,b,i,j,s=0,t=0,k;
while(cin>>n)
{
for(k=1;k<=n;k++)
{
s=0;t=0;//将两个真约数的加和值初始化为零
cin>>a>>b;
for(i=1;i<a;i++)
{
if(a%i==0)//找出第一个数的所有的真约数
s+=i;//真约数加和
}
for(j=1;j<b;j++)
{
if(b%j==0)//找出第二个数的所有的真约数
t+=j;//真约数加和
}
if((s==b)&&(t==a))//当两数的所有真约数之和与另一个数都相等
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
*11.第二十三题:
题意:找出不含有4和62的数,计算出个数并输出
解题思路:
#include<iostream>
bool hs(int x)//函数指针??
{
while(x)
{
if(x%10==4||x%100==62)//求余处理
{
return true;
}
x/=10;
}
return false;
}
using namespace std;
int main()
{
int n,m,i,s,num;
while(cin>>m>>n,m!=0||n!=0)
{
num=0;
for(i=m;i<=n;i++)
{
if(hs(i)==true)//如果含有不吉利数字
num++;//累计个数
}
s=n-m+1-num;//不含不吉利数字的个数
cout<<s<<endl;
}
return 0;
}
*12.第一题:
题意:第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。
解题思路:从第n天开始算起比较容易,因为n天的剩余个数是已知的,且满足后一天等于前一天的一半加一。
#include<iostream>
using namespace std;
int main()
{
int i,n;
int sum;
while(cin>>n)
{
sum=1;//第n天的桃子个数
for(i=2;i<=n;i++)
sum=(sum+1)*2;//满足关系式,用于求出第一天时的桃子总个数
cout<<sum<<endl;
}
return 0;
}
*13.第三题:
题意:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。两个点不会在圆心出现。
解题思路:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n;
double PI=3.1415926;//定义pai的值
double x1,x2,y1,y2,a,b,c,s,g;
cin>>n;
while (n--)
{
cin>>x1>>y1>>x2>>y2;//输入顺序唯一,否则错
a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));/*求出所求角所对应的边长*/
b=sqrt(x1*x1+y1*y1);//一个临边长
c=sqrt(x2*x2+y2*y2);//另一个临边长
double g=(b*b+c*c-a*a)/(2*c*b);//运用余弦定理求出cos(g)
s=acos(g);//arccos(g)求出角度值
printf("%.2lfn",s*180.00/PI);//角度换算保留两位小数
}
}
*14.第五题:what???
题意:把一个偶数拆成两个不同素数的和,找出所有的拆法。输出其拆成不同素数的个数,每个结果占一行。
解题思路:
细节处理:
1.从2开始查找可以整除的数;
#include<iostream>
using namespace std;
int main()
{
int n,i,j,s,a[10000];
for(i=3;i<=10000;i++)
a[i]=i;
for(i=2;i<=10000;i++)
for(j=2*i;j<=10000;j+=i)//???
a[j]=0;
while (cin>>n&&n)//必须加上“&&n”(?)
{
s=0;
for(i=3;2*i<n;i++)//???
if(a[i]+a[n-i]==n)
s++;
cout<<s<<endl;
}
return 0;
}
*15.第六题:
题意:一个数满足十进制数,十六进制数,十二进制数都是相等的数,称为sky数,要判断一个数是不是sky数。
解题思路:需要进行进制的换算,并判断三种进制下的值是不是相等。
细节处理:
1.运用进制的转换函数(?)
2.需要判断函数的不同进制下的值是否相同
#include<iostream>
using namespace std;
int f(int n,int r)//完整的进制转换调用函数,进行进制的换算
{
int sum=0,i,s;
for(i=1;n!=0;i++)
{
s=n%r;
n=n/r;
sum+=s;
}
return sum;
}
int main()//主函数
{
int n;
while(cin>>n&&n!=0)//当n不等于0时
{
if(f(n,10)==f(n,12)&&f(n,10)==f(n,16))//判断不同进制时的值是否相等
cout<<n<<" "<<"is a Sky Number."<<endl;//相等或不相等时输出如下
else
cout<<n<<" "<<"is not a Sky Number."<<endl;
}
return 0;
}
总结:
1.在课程设计中遇到了很多没有用过的头文件以及算法,比如,进制转化,进制之间的比较;素数的应用也有很多。
2.在课程设计二中题目更多的运用到了数学知识,比如角度的计算和换算;递推算法用到了很多次,可以简化计算的步骤。在这些题目中,更多的用到了多组输入,使用while语句进行输入,同时while后面括号里的内容也很有讲究。
3.有很多的题目要注意的地方很多,有一点错误就会wrong;同时,通过这些题目,我还发现了很多没见过的算法,头文件,以及很多中输入方式,比如while(cin>>n&&n);while(cin>>&&n!=0||m!=0)等等。
4.素数的题目,约数的题目是出现最多的,应该重点掌握;递推的题目也有很多。
5.输入之前应该着重注意初始化,有一些是要在主函数之外进行定义,就会省去初始化的步骤减少错误的出现。另外,换行也是应该注意的地方。
6.有一些题目正向思维下很难计算出结果,比如猴子偷吃蟠桃的题目,但是采用逆向思维就会比较容易。所以,我们还应该注重思维的转化。例如:多项式求和的题目中,将式子分成两部分分别进行计算在求和会更加的容易。水仙花数的题目,看起来很简单,但是实际上却有很多的思维在里面,以至于出现很多的错误,一直wrong……
所以,理解很重要,应该先把题目弄清楚,理清思路再写程序,才不至于错误百出。
最后
以上就是温暖板凳为你收集整理的课程设计总结的全部内容,希望文章能够帮你解决课程设计总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复