C语言课程设计

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进制输出想加再比较相等即可

猜你喜欢

转载自blog.csdn.net/qq_43642006/article/details/86139113