C语言课程设计
课设一:
1.Problem A
Problem Description
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
Input
输入数据有多组,每组占一行,由一个整数组成。
Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。
Sample Input
#include <math.h>
#include <stdio.h> //c语言头文件。
int main()
{ int t;
while (scanf("%d", &t)!= EOF) //输入t
{
if (t < 0)
puts("Score is error!");
else if (t< 60) //连续运用if-else语句。
puts("E");
else if (t< 70)
puts("D");
else if (t< 80)
puts("C");
else if (t< 90)
puts("B");
else if (t< 101)
puts("A");
else
puts("Score is error!"); //输出相应结果
}
return 0;}
2.Problem B
Font Size: ← →
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
#include <stdio.h> //c语言头文件
int main()
{
int m, n,flag,a, b, c,i;
while (scanf("%d%d", &m, &n) != EOF) //输入m,n
{
flag = 0;
for ( i = m; i < n+1; i ++) //for循环语句
{
a = i % 10;
b = (i/10)%10;
c = (i/100)%10;
if ( i == a * a * a+ b * b * b + c * c * c) //if控制条件
if(flag==0)
{
printf (" ");//如果前面已输出过水仙花数 则先输出" " 再输出水仙花数
flag = 1;
}
Else
printf (" %d", i);
}
if (flag == 0)//
printf("no");//如不存在水仙花数 输出no
printf("\n"); //按要求换行
}
return 0;}
3.Problem D
Problem Description
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
#include<stdio.h> //c语言头文件
#include<math.h>
int main (){
int x,y,i,j,k,h,flag;
while(scanf("%d%d",&x,&y)!=EOF)
{
if(x==0&&y==0)break; //输出x,y=0的情况
for(flag=0,h=0,i=x;flag==0&&i<=y;i++)//for循环语句
{
k=i*(i+1)+41;
for(j=2;j<=sqrt(k);j++)//将上一个for循环中的条件带入
{
if(k%j==0)
{
flag=1;
break;
}//输出不是素数的情况
}
if(flag==1){
h=1;
printf("Sorry\n");
break;
}//判断并输出“sorry”
}
if(h==0)printf("OK\n");//如果h=0;输出“ok”
}
return 0;
}
4.Problem E
Problem Description
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
现在请你求出该多项式的前n项的和。
由数学知识,原多项式可化为1-1/2+1/3-1/4…
故当n为奇数时,前面系数为+1,n为偶数时,前面系数为-1.
#include <iostream> //c++头文件
#include <iomanip>
using namespace std;
int main()
{
int m,a[100];
cin>>m; //输入m
for(int i=0;i<m;i++)
cin>>a[i]; //输入数组a【i】
for(int i=0;i<m;i++)
{
double sum=0;
for(int k=1;k<=a[i];k++) //for循环语句
{
if(k%2==1) //判断k的奇偶性
sum+=1.0/k;
else
sum-=1.0/k;
}
cout<<fixed<<setprecision(2)<<sum<<endl;//输出保留2位小数。
}
}
5.Problem G
Problem Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
#include<stdio.h> //c语言头文件
int main()
{
int max,min,n,i,s,sum;
double ave; //双精度输入平均值
while(scanf("%d",&n)!=EOF) //输入n
{
max=-1;min=101;sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&s);
sum=sum+s;
if(max<s) max=s;//判断最高分和最低分
if(min>s) min=s;
}
ave=(sum-max-min)*1.0/(n-2); //运用数学算法计算平均值
printf("%0.2f\n",ave);//输出保留2位小数。
}
return 0;
}
6.Problem H
Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
首先看输入输出,可以知道当年数小于等于4的时候,第几年就有几头牛,当n大于4的时候,这时候第一年出生的小母牛又可以生小牛了,也就是说要考虑到小牛是否可以生了。每年都有有a(n-1)头母牛,那么就要知道这一年出生的母牛有多少。第n-3年有多少头母牛,到了第n年这些牛都能生小牛了,因此出生数a(n-3。 从而今年的母牛数为a(n)=a(n-1)+a(n-3)。 因此得到递推公式:a(1)=1,a(2)=2,a(3)=3,a(n)=a(n-1)+a(n-3)(n>=4)。按照公式用数组表示输出即可。
#include <cstdio>
int a[60];
int main()
{
int n;
a[1] = 1;
a[2] = 2;
a[3] = 3;
a[4] = 4;
for(int i=5;i <= 60;i++)
a[i] = a[i-1] + a[i-3];
while(~scanf("%d",&n) && n != 0)
{
printf("%d\n",a[n]);
}
return 0;
}
7.Problem M
Font Size: ← →
Problem Description
输入一个十进制数N,将它转换成R进制数输出。
Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
#include<stdio.h>//c语言头文件
#include<string.h>//字符串头文件
int main()
{
int n,r,i;
while(scanf("%d %d",&n,&r)!=EOF)//输入n,r
{
if(n<0)
{
printf("-");n=-n;//讨论n为负数的情况
}
if(n==0)
{printf("0\n");} //讨论n=0的情况
int c=0,a[100];
while(n)
{
a[c]=(n%r);//转换进制
c++;
n/=r;
}
for(i=c-1;i>=0;i--)
{
if(a[i]>=10)
{
printf("%c",'A'+a[i]-10);//需要进位时输出A-10+a【i】
}
else printf("%d",a[i]);
}
printf("\n");//按要求换行
}
}
8.Problem N
Problem Description
HDOJ上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱。
这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
这道题需要注意的是时间是以60进1,需要判断在两个时间相加后是否有进1的情况。
#include<iostream> //c++头文件
using namespace std;
int main()
{ int n,i;
cin>>n;
for(i=n;i>0;i--)
{int h1,m1,s1;
int h2,m2,s2;
int h3,m3,s3;
cin>>h1>>m1>>s1; //输入两个时间
cin>>h2>>m2>>s2;
s3=s1+s2;
h3=h1+h2;
m3=m1+m2;
if (s3 >= 60) //判断是否需要进位
{
s3 -= 60;
m3++;
}
if (m3 >= 60) // 判断是否需要进位
{
m3 -= 60;
h3++;
}
cout<<h3<<" "<<m3<<" "<<s3<<endl;//按要求中间取空格输出
}
return 0;
}
9.Problem Q
Problem Description
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数
#include<stdio.h>//c语言头文件
int main()
{
int m;
scanf("%d",&m);//输入m
while(m--)//
{
int i,a,b,q=0,w=0;
scanf("%d%d",&a,&b);//输入a,b
for(i=a-1;i>=1;i--) //for循环
{
if(a%i==0) //判断真约数
q=q+i;//真约数累加
}
if(q==b)
{
for(i=b-1;i>=1;i--)
{
if(b%i==0)//
w=w+i;
}
if(w==a)printf("YES\n");//若符合条件则输出yes
else printf("NO\n");//
}
else printf("NO\n");//不符合则输出no
}
return 0;
}
10.Problem V
Problem Description
有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).
若给出A0, An+1, 和 C1, C2, .....Cn.
请编程计算A1 = ?
本题需要较高的数学递推。
Ai=(Ai-1+Ai+1)/2 - Ci,
A1=(A0 +A2 )/2 - C1;
A2=(A1 + A3)/2 - C2 , …
=> A1+A2 = (A0+A2+A1+A3)/2 - (C1+C2)
=> A1+A2 = A0+A3 - 2(C1+C2)
A1+A1 = A0+A2 - 2(C1)
A1+A2 = A0+A3 - 2(C1+C2)
A1+A3 = A0+A4 - 2(C1+C2+C3)
A1+A4 = A0+A5 - 2(C1+C2+C3+C4)
…
A1+An = A0+An+1 - 2(C1+C2+…+Cn)
(n+1)A1+(A2+A3+…+An) = nA0 +(A2+A3+…+An) + An+1 - 2(nC1+(n-1)C2+…+2Cn-1+Cn)
=> (n+1)A1 = nA0 + An+1 - 2(nC1+(n-1)C2+…+2Cn-1+Cn)
=> A1 = [nA0 + An+1 - 2(nC1+(n-1)C2+…+2Cn-1+Cn)]/(n+1)
#include<stdio.h>
int main()
{
int n,i;
double a,b,a1,c[3003];
while(scanf("%d",&n)!=EOF)
{
scanf("%lf%lf",&a,&b);
for(i=1;i<=n;i++)
scanf("%lf",&c[i]);
a1=n*a+b;
for(i=1;i<=n;i++)
a1=a1-2*i*c[n-i+1];
printf("%.2lf\n",a1/(n+1));
}
return 0;
}
11.Problem S
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。其中,蜂房的结构如下所示。
这也是一个数学递推题,c1=1,c2=2,c3=3,c4=5….ci=ci-1+ci-2,再用数组表示即可。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a,b;
double c[51]={0};
c[2]=1;
c[3]=2;
for(int i=4;i<=50;i++)
c[i]=c[i-1]+c[i-2];
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
printf("%.0f\n",c[b-a+1]);
}
return 0;
}
课设二:
12.Problem C
Problem Description
这次xhd面临的问题是这样的:在一个平面内有两个点,求两个点分别和原点的连线的夹角的大小。
注:夹角的范围[0,180],两个点不会在圆心出现。
运用sqrt函数和向量点积公式。
#include<iostream>.//c++头文件
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
int i, T;
double x1, x2, y1, y2, g, u, h;
cin >> T;
for (i = 1; i <= T; i++)
{
cin >> x1 >> y1 >> x2 >> y2;//输入x1,x2,y1,y2
h = (x1 * x2) + (y1 * y2);
g = (sqrt(x1 * x1 + y1 * y1)) * (sqrt(x2 * x2 + y2 * y2));//使用sqrt函数构造数学表达式
u = (acos(h / g)*180)/3.1415926;//运用数学公式
cout << fixed << setprecision(2) << u << endl;//输出保留两位小数
}
}
13.Problem D
Problem Description
一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?
这道题的陷阱在于输出的是“02”而不是“2”需要在输出时加入printf("%02d",i)
#include<stdio.h>//c语言头文件
int main()
{
int a,b,i,j,d[101],t=0;
while(scanf("%d%d",&a,&b)!=EOF)//输入a,b,
{
if(a==0&&b==0)
break;
t=0;
for(i=0;i<100;i++)//for循环
{
j=a*100+i;//选择条件
if(j%b==0)
{
if(t)
printf(" ");//输出空格
};
t=1;
}
}
printf("\n");//换行
}
return 0;
}
14.ProblemE
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢
#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=2*i;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;
}
15.ProblemF.
Problem Description
Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。Sky非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。
Input
#include<cstdio>
#include<cmath>
using namespace std;
main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int a,b,c,d;
d=n%10;
c=((n%100)-d)/10;
a=n/1000;
b=(n/100)%10;
int sum1=a+b+c+d;
int num1=n%16;
int num2=(n%(16*16)-num1)/16;
int num4=n/(16*16*16);
int num3=(n/(16*16))%16;
int sum2=num1+num2+num3+num4;
int p,q,r,s;
p=n%12;
q=((n%(12*12))-p)/12;
s=n/(12*12*12);
r=(n/(12*12))%12;
int sum3=p+q+r+s;
if(sum1==sum2&&sum1==sum3)
{
printf("%d is a Sky Number.\n",n);
}
else
{
printf("%d is not a Sky Number.\n",n);
}
}
return 0;
}
分别用10.12.16进制输出想加再比较相等即可