c++程序设计课程总结

1、Problem A
简要题意:
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
多组数据,对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
解题思路:
对于此类题首选的解决方法其实是if语句。但本人在写时忽然想到是否可以用switch语句针对成绩的首位进行分类进行解答,因此尝试了一下该方法。
解题细节:
运用switch语句答题的关键在于把各个成绩区段的区别提取出来。不难观察到,若t/10后,0-5均输出E,6输出D,7输出C,8输出B,9和10输出A。且小于0和大于100的数应不在该范围内,直接输出“Score is error!”。
源码:
#include
using namespace std;
int main()
{
int t;
while(cin>>t)
{
if(t<0)
cout<<“Score is error!\n”;
else
{
int n=t/10;
switch(n)
{
case 9:
case 10:cout<<‘A’<<endl;break;
case 8:cout<<‘B’<<endl;break;
case 7:cout<<‘C’<<endl;break;
case 6:cout<<‘D’<<endl;break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:cout<<‘E’<<endl;break;
default :cout<<“Score is error!\n”;
}
}
}
2、Problem B
简要题意:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。现在要求输出所有在m和n范围内的水仙花数。如果有多个则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
解题思路:
只需提出三位数的各位数字,输出从m到n内与其立方和相等的数即可
解题细节:
此题有一个陷阱,即多个水仙花数中间由“ ”隔开,但在输出最后一个水仙花数a时,若稍不注意便会输出a” “,从而导致程序出错。
源码:
#include<stdio.h>
int main()
{
​int m,n;
​int a,b,c,t,k;
​while(scanf("%d%d",&m,&n) == 2)
​{
​​k=0;
​​for(;m<=n;m++)
​​{
​​​a=m%10;
​​​b=m/10%10;
​​​c=m/100;
​​​t=aaa+bbb+ccc;
​​​if(m == t)
​​​{
​​​​if(k == 1) printf(" “);​​​​​​printf(”%d",m);
​​​​k=1;​​​​​
​​​}
​​}
​​if(k == 0)​​​​​
​​printf(“no”);
​​printf("\n");
​}
​return 0;
}
3、Problem C
简要题意:
给你n个整数,求他们中所有奇数的乘积。输入数据包含多个测试实例。
解题思路:
这道题比较简单,只需要输入多组数组,依次筛选出奇数让其叠乘即可。
解题细节:
注意c=1以便每次测试还原初始值
源码:
#include<stdio.h>
int main()
{
int a,b,c=1,i;
while((scanf("%d",&a))!=EOF)
{
c=1;
​ for(i=0;i<a;i++)
{
​ scanf("%d",&b);
​ if(b%2!=0)
c*=b;
}
​printf("%d\n",c);
}
}
4、Problem D
简要题意:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …现在请你求出该多项式的前n项的和。
解题思路:
本题应输入多组数据,且每组数据对应的运算均不同,应考虑嵌套循环,在第一个循环下再加上一个循环并判断正负号进行叠加。
解题细节:
应注意当分母为2的倍数时其前面对应的符号为“-”,当分母为奇数时则为“+”,如何区分正负号是这道题的关键。
源码:
#include<stdio.h>
int main()
{
int a[101],n;
double m,t,b;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
m=0;
t=0;
b=1;
for(int j=1;j<=a[i];j++)
{
m+=1;
if(j%2!=0)
{
t+=b/m;
}
if(j%2==0)
{
t=t-(b/m);
}
}
printf("%.2f\n",t);
}
}
return 0;
}
5、Problem E
简要题意:
长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。
解题思路:
int定义后输入多组数据且令a,b=0还原初始值,利用循环将每组测试中的数列数值求出,每m个数求一次平均,不足m时求和除以m即可。
解题细节:
用if语句对b和a进行判断,进而把满足m个数和不满足m个数进行分开运算。
源码:
#include<stdio.h>
int main()
{
int n,m,i,a,b;
while(scanf("%d %d",&n,&m)!=EOF)
{
b=0;a=0;
for(i=2;i<=n2;i+=2)
{
a+=i;
b++;
if(b == m&&(i!=n
2))
{
printf("%d “,a/b);
b-=m;
a=0;
}
}
if(a == 0 && b == 0) continue;
printf(”%d\n",a/b);
}
return 0;
}
6、Problem F
简要题意:
评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。结果保留2位小数,每组输出占一行。
解题思路:
先将所有成绩从小到大排序,然后从第二大元素加到倒数第二大的元素,用这个和除以n-2,就是平均值了
解题细节:
应运用sort函数进行排序以便除去最高分和最低分。但在C中并不包含sort函数,故应添加using namespace std调用sort函数,且不能忘记添加头文件。
源码:
#include <stdio.h>
#include
using namespace std;
int main()
{
int n,i;
double sum=0,m[110],s;
while (scanf("%d",&n)!=EOF)
{
sum=0;
for (i=0;i<n;i++)
{
scanf("%lf",&m[i]);
}
sort(m,m+n);
for (i=1;i<n-1;i++)
{
sum=sum+m[i];
}
s=sum/(n-2);
printf("%.2lf\n",s);
}
return 0;
}
7、Problem G
简要题意:
输入n(n<=100)个整数,按照绝对值从大到小排序后输出。对于每个测试实例,结果中两个数之间用一个空格隔开。每个测试实例占一行。n=0表示输入数据的结束,不做处理。
解题思路:
输入数据后对其进行平方处理,判断大小后按顺序输出即可(也可使用sort函数)
解题细节:
应注意输出数据的空格问题
源码:
#include
using namespace std;
int main()
{
int a[100],i,j,t,n;
while(cin>>n&&n!=0)
{
for(i=0; i<n; i++)
cin>>a[i];
for(j=0; j<n; j++)
for(i=0; i<n-1-j; i++)
if(a[i]a[i]<a[i+1]a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0; i<n-1; i++)
cout<<a[i]<<" “;
cout<<a[n-1]<<endl;
}
return 0;
}
8、Problem H
简要题意:
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。 如果一个字符串是回文串,则输出"yes”,否则输出"no"。
解题思路:
把字符串分为两个数组,分别等于字符串的正反顺序,若两数组相等的数量和字符串的长度一致则输出yes,反之输出no。
解题细节:
b[i] = a[length-1-i]这里一定要注意顺序问题,让b数组从字符串最右边到最左边结束。
源码:
#include <stdio.h>
#include <string.h>
int main (void)
{
int n;
while (scanf("%d",&n)!=EOF)
{
int i,length,count;
char a[1000],b[1000];
while (n–)
{
count = 0;
scanf("%s",a);
length = strlen(a);
for (i=0;i<length;i++)
b[i] = a[length-1-i];
for (i=0;i<length;i++)
if (b[i] == a[i])
count++;
if (count == length)
printf(“yes\n”);
else
printf(“no\n”);
}
}
return 0;
}9、Problem I
简要题意:
如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。编写一个程序,判断给定的两个数是否是亲和数,对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
解题思路:
循环找出A的所有真约数,加在一起判断是否与B相等。
解题细节:
穷举法应注意不超过时间限制,若超过时间限制应采用直接求约数的方法。
源码:
#include<stdio.h>
int main ()
{
int M,sum,i;
int A,B;
scanf("%d",&M);
while(M–)
{
sum=0;
scanf("%d%d",&A,&B);
for(i=1;i<A;i++)
{
if(A%i == 0)
sum+=i;
}
if(sum == B)
printf(“YES\n”);
else
printf(“NO\n”);
}
return 0;
}
10、Problem J
简要题意:
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?请输出不同走法的数量
解题思路:
找递推规律,每到达一个阶梯,他一定是从前一个或者前两个楼梯走过来的,那它的走法就是前一个走法和前两个走法的和。
解题细节:
x[i]=x[i-1]+x[i-2]
源码:
#include
using namespace std;
int x[50];
int main()
{
int T;
cin >> T;
while(T–)
{
int a;
cin >> a;
a–;
x[1]=1;
x[2]=2;
for(int i=3;i<=a;i++)
{
x[i]=x[i-1]+x[i-2];
}
cout << x[a] << endl;
}
return 0;
}
11、Problem K
简要题意:
假设所有的短号都是是 6+手机号的后5位,如果给你一个11位长的手机号码,输出应包括N行,每行包括一个对应的短号,输出应与输入的顺序一致。
解题思路:
将手机号看做一个数,对其除以十万得余数即可
解题细节:
应注意考虑0的情况,如13512305678,直接除以十万得到的余数为5678,掉了0导致结果错误。
源码:
#include
#include <math.h>
using namespace std;
int main()
{
int N,j,i;
​long long int a[210];
cin>>N;
​for(i=1;i<=N;i++)
​{
​​cin>>a[i];
​​for(j=5;j>=1;j–)
​​{if(j == 5)
​ cout<<‘6’<<a[i]%(int)pow((double)10,j)/(int)pow((double)10,(j-1));
​​else
​​cout<<a[i]%(int)pow((double)10,j)/(int)pow((double)10,(j-1));
​ }
​​cout<<"\n";
​}
return 0;
}
12、Problem L
简要题意:
妈妈每天都要出去买菜,到底花了多少钱真是一笔糊涂帐。由于最小支付单位是角,所以总是在支付的时候采用四舍五入的方法把分头去掉。最后,请输出一个精度为角的菜价总量。解题思路:
简单的求和问题,只需要输入单价和数量,计算每组和即可
解题细节:
(sum
10+0.5)/10.0,由于支付时要四舍五入舍掉分,应加上0.5分判断是否进到下一位,这里很容易被忽视而出错。
源码:
#include<stdio.h>
#include<math.h>
int main(void)
{
char s[20];
double n, m, sum=0.0;
while(scanf("%s %lf %lf", s, &n, &m)!=EOF)
{
sum+=n
m;
}
printf("%.1lf\n", floor(sum10+0.5)/10.0);
return 0;
}
13、Problem M
简要题意:
判断任何一个十进制的四位数,是不是Sky数。Sky数:十进制,十六进制,十二进制的四位数之和均相等。若n为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”。每个结果占一行。注意:#n表示所读入的n值。
解题思路:
简单的进制转换问题,只需要将输入的数值分别转换为十六进制,十二进制,再以此把四位数相加判断是否相等即可。
解题细节:
注意输出的句尾含有标点符号。
源码:
#include
#include
using namespace std;
int main()
{
int N,n,m,q;
int a,b,c;
int h,t,p;
while(cin>>n)
{
N=n,m=n,q=n;
p=0,h=0,t=0;
if(n == 0)break;
for(int i=0;i<4;i++)
{
a=n%10;
h+=a;
n/=10;
}
for(int i=0;i<4;i++)
{
b=m%16;
t+=b;
m/=16;
}
for(int i=0;i<4;i++)
{
c=q%12;
p+=c;
q/=12;
}
if(h == t&&t == p)
cout<<N<<" is a Sky Number."<<endl;
else
cout<<N<<" is not a Sky Number."<<endl;
}
return 0;
}
14、Problem N
简要题意:
在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。注:夹角的范围[0,180],两个点不会在圆心出现。输入数据的第一行是一个数据T,表示有T组数据。每组数据有四个实数x1,y1,x2,y2分别表示两个点的坐标
解题思路:
求两线夹角问题,可用向量积直接解决,也可以用余弦定理去做,但比向量积麻烦。
解题细节:
acos((x1
x2+y1y2)/(sqrt(x1x1+y1y1)sqrt(x2x2+y2y2)))180/PI,这一步是解题的关键,即向量积求夹角的公式,应调用acos反余弦函数。
源码:
#include
#include
#define PI acos(-1.0)
int main()
{
double x1,y1,x2,y2;
int ncase;
scanf("%d",&ncase);
while(ncase–)
{
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
printf("%.2lf\n",acos((x1
x2+y1y2)/(sqrt(x1x1+y1y1)sqrt(x2x2+y2y2)))180/PI);
}
return 0;
}
15、Problem O
简要题意:
把一个偶数拆成两个不同素数的和,有几种拆法?输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
解题思路:
穷举法找出所有素数判断素数和是否等于n是常规方法,但有可能TL,因此可以把a[i]=3~10000事先赋值,再筛选出非素数最后求和即可。
解题细节:
for(j=2
i;j<=10000;j+=i)
a[j]=0; 通过这一步可以除去所有偶数以及奇数中的非负数
源码:
#include<stdio.h>
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=2i;j<=10000;j+=i)
a[j]=0;
while(scanf("%d",&n)!=EOF&&n)
{
s=0;
for(i=3;2
i<n;i++)
if(a[i]+a[n-i]==n)
++s;
printf("%d\n",s);
}
return 0;
}
总结:
本次课程设计持续了一周,在这期间,我通过解答HDU里的种种问题,对于培养自己的算法思想以及运用程序语言解答问题的能力有了很大的提升。在本次课程设计中,我共选择了十五道程序题,难度逐渐提升,涵盖较全方面。如前面几道题运用了结构循环,中间几道题则设计到了程序语言库中的函数,结尾几道题则需要运用一定的算法知识,如四舍五入,进制转换,向量积求夹角等等。
​总之,本次课程设计对我本人能力的提升十分显著,令我熟练掌握了C语言和C++语言,并以此进一步比较两者的不同,两者的优势和劣势,令我获益匪浅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值