《c++程序设计》课程设计报告

班级:2018级数学类1  学号:2018212827

 

报告人姓名:段振威

 

实验地点: 教学楼409实验室

 

完成起止日期: 2018.1.2——2018.1.4

 

 

Problem 01(第一套1001

  • 输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
    90~100为A;
    80~89为B;
    70~79为C;
    60~69为D;
    0~59为E;
  • 题意

此题为简单的输入输出,只需输入一个百分制成绩,接着通过题目中的限制条件,转换成对应的等级即可。

  • 思路

通过循环实现多组输入,通过if和else来判断。

  • 细节

注意要t>=90&&t<=100,而不是90=<t<=100。

  • 源代码

#include<stdio.h>
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
if(t>=90&&t<=100)
printf("A\n");
if(t>=80&&t<=89)
printf("B\n");
if(t>=70&&t<=79)
printf("C\n");
if(t>=60&&t<=69)
printf("D\n");
if(t>=0&&t<=59)
printf("E\n");
if(100<t||t<0)
printf("Score is error!\n");
}
return 0;
}

 

 

Problem 02(第一套1003

  • 给你n个整数,求他们中所有奇数的乘积。
  • 题意

有n个整数,n个数中会有各种各样的数,把里面

  • 思路

一个循环多组输入n,一个循环输入整数,循环中加入判断条件来判断是否为奇数。

  • 细节

注意换行\n

  • 源代码

#include<stdio.h>
int main()
{
    int i,n,sum,p;
    while(scanf("%d",&n)!=EOF)
    {
sum=1;
        for(i=0;i<n;i++)
        {
            scanf("%d",&p);
 
            if(p%2==1)
                sum*=p;
        }
        printf("%d\n",sum);
    }
    return 0;
}

 

 

Problem 03(第一套1004

  • 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
  • 题意

输入x和y后,n在x和y之间取值,计算关于n的表达式的值,并判断是否为素数。

  • 思路

输入x和y后,通过for循环实现输入区间(x,y)中的n,有了n之后,加上判断条件判断是否为素数。

  • 细节

定义一个变量a=0或a=1,a=1代表n全为素数,如果a=1,输出OK;同样a=0代表至少有一个不是素数,输出Sorry。不要忘了如果x和y为0时,berak。

  • 源代码

#include<stdio.h>
#include<math.h>
int main()
{
int i,n,x,y,k,s;

while(scanf("%d%d",&x,&y)!=EOF)
{
   int a=1;
   if(x==0&&y==0)
            break;
for(n=x;n<=y;n++)
{
    s=n*n+n+41;
        k=sqrt(s);
    for(i=2;i<=k;i++)
  {
if(s%i==0)
{a=0;
break;}
  }         
     }
if(a==0)
printf("Sorry\n");
if(a==1)
printf("OK\n");
}
    return 0;
}

 

 

Problem 04(第一套1005

  • 多项式的描述如下:
    1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
    现在请你求出该多项式的前n项的和。、
  • 题意

每输入一个整数n,输出对应的前n项的和。

  • 思路

输入m个n后,,有了n后,写出关于此式的累加,输出和即可。

  • 细节

每一次都要初始化和为0,分别输出和。pow(x,y)代表x的y次方。

  • 源代码

#include<stdio.h>
#include<math.h>
int main()
{

int i,k,m;
scanf("%d",&m);
int a[m+1];
for(i=1;i<=m;i++)
{
 scanf("%d",&a[i]);
double s=0 ;
 for(k=1;k<=a[i];k++)

{
s=s+(1/((pow((-1),(k+1)))*k));
}
printf("%.2lf\n",s);
}
return 0;
}

 

 

Problem 05(第一套1007

  • 青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
  • 题意

n个数据中,去掉最大值和最小值,然后将剩下的数据求出平均值,即为得分。

 

  • 思路

先将n个数求和,根据题中给出的范围,故意先定义最大值与最小值(见源码),然后与每一个数据比较,得最大值和最小值,和减去最大值与最小值之后除以(n-2)

  • 细节

注意根据题目给出的范围来定义最值。

  • 源代码

#include<stdio.h>

int main()
{
int max,min,n,i,s,sum;
double ave;
while(scanf("%d",&n)!=EOF) 
{
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);
}
return 0
}

 

 

Problem 06(第一套1009

  • 输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
  • 题意

对所有的数加绝对值后排序输出。

  • 思路

fabs绝对值函数,冒泡排序

  • 细节

最后一个数后没有空格,n==0;break;

  • 源代码

#include<stdio.h>
#include<math.h>
int main()
{
int n;
int i;
int j;
int t;
int a[201];
while(scanf("%d",&n)!=EOF)
 {
 
 if(n==0)
  break;
  for(i=0;i<n;i++)
{
  scanf("%d",&a[i]);
  }
  for(i=0;i<n-1;i++)
 {
  for(j=i+1;j<n;j++)
 {
  if(fabs(a[i])<fabs(a[j]))
 {
  t=a[i];
  a[i]=a[j];
  a[j]=t;
   }
   }
   }
  for(i=0;i<n-1;i++)
{
  printf("%d ",a[i]);
  }
  printf("%d\n",a[i]);
 }
 return 0;
}

 

 

Problem 07(第一套1010

  • 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。
  • 题意

先插入后排序

  • 思路

输入n个数后,直接将x放最后,再重新排序,再输出。

  • 细节

最后一个数后没有空格,分别输出,使用sort排序,注意头文件。n==0时,break.

  • 源代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,i,m,a[101];
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
{break;}
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
    a[n]=m;
sort(a,a+n+1);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[n]);
}
return 0;
}

 

 

Problem 08(第一套1011

  • 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
    但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
    这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
  • 题意

尽量用最少的张数发放工资,而且要刚刚好。

  • 思路

“贪心算法”,分别用工资从100开始除以,得第一个张数,然后对100求余。依次对50,等相同操作,将所有张数加起来即为结果。

  • 细节

工资为0时,break;

  • 源代码

#include<stdio.h>
int main()
{
int n,i,temp,sum;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&temp);
sum+=temp/100;
temp%=100;
sum+=temp/50;
temp%=50;
sum+=temp/10;
temp%=10;
sum+=temp/5;
temp%=5;
sum+=temp/2;
temp%=2;
sum+=temp;
}
printf("%d\n",sum);
}
return 0;
}

 

 

Problem 09(第一套1012

  • “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
  • 题意

写一个程序,判断输入的字符串是否回文。

  • 思路

先输入字符串,通过下标操作来判断是否回文

  • 细节‘

定义变量表示“真”假“

  • 源代码

#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
int n,x;
while(cin>>x)
{
for(int i=0;i<x;i++)
{
bool b=true;
cin>>a;
        n=a.size();
        for(int i=0;i<n/2;i++)
        if(a[i]!=a[n-i-1])
        b=false;
        if(b)
        cout<<"yes"<<endl;
    else
        cout<<"no"<<endl;
}
}
return 0;

 

 

Problem 10(第一套1014

  • HDOJ上面已经有10来道A+B的题目了,相信这些题目曾经是大家的最爱,希望今天的这个A+B能给大家带来好运,也希望这个题目能唤起大家对ACM曾经的热爱。
    这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
  • 题意

将输入的两组数相加。

  • 思路

输入N个两组数后,有了这两组数,两组秒相加大于60多出对应的分,通过整数整除60实现得到对应的分。而将要输出的秒即为两组秒相加对60求余。两组分相加再加上上面得到的分对60求余即为将要输出的分。而多出的时为两组分相加再加上上面得到的分对60整除。最后将时都加起来为将要输出的时。

  • 细节

空格输出,改行。

  • 源代码。

#include <stdio.h>
int main()
{
    int N,AH,AM,AS,BH,BM,BS;
    int h,m,s;
    int h_carry,m_carry;
    while (scanf("%d",&N)!=EOF)
    {
        for(int i=0;i<N;i++)
        {


 scanf("%d%d%d%d%d%d",&AH,&AM,&AS,&BH,&BM,&BS);
            s=(AS+BS)%60;
            m_carry=(AS+BS)/60;
            m=(m_carry+AM+BM)%60;
            h_carry=(AM+BM+m_carry)/60;
            h=h_carry+AH+BH;
        printf("%d %d %d\n",h,m,s);
        }

    }
    return 0;

}
}

 

 

Problem 11(第一套1017

  • 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

    1+2+4+5+10+11+20+22+44+55+110=284。

    而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。

    你的任务就编写一个程序,判断给定的两个数是否是亲和数
  • 题意

将这两个数的所有真约数找出来,相加是否为另一个数。

  • 思路

直接从循环i从1开始到这个数本身-1,用这个数对i求余,若余数为0,就加在一起。另一个数也是如此,然后判断加起来是否为另一个数。

  • 细节

多组输入这两个数

  • 源代码

#include<stdio.h>
int main()
{    int A,B,M;  
  while (scanf("%d",&M)!=EOF)
{  
      for(int i=0;i<M;i++)        {            scanf("%d%d",&A,&B);         
            int sum=0,sun=0;         
   for (int j=1;j<A;j++)          
  {                if(A%j==0)               
                  sum+=j;           
 }                   
for (int k=1;k<B;k++)        
    {                
if(B%k==0)               
 sun+=k;            }          
  if(sum==B&&sun==A)           
 printf("YES\n");         
   else         
   printf("NO\n");  
      }
    }  
  return 0;
}

 

 

Problem 12(第一套1018

  • 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
  • 题意

从第一级到第M级有多少选择。

  • 思路

典型的斐波那契数列问题,从第一级到第二级有1种走法,从第一级到第三级有2种走法,从第一级到第M级有f(M)=f(M-1)+f(M-2)种走法。

  • 源代码、

#include<stdio.h>
int main()
{
   int i,N,M,a[50];
   scanf("%d",&N);
   for(i=0;i<N;i++)
   {
       scanf("%d",&M);
       a[2]=1;
       a[3]=2;
       for(int j=4;j<=M;j++)
       {a[j]=a[j-1]+a[j-2];}
       printf("%d\n",a[M]);}
     return 0;
}

 

 

Problem 13(第一套1024

  • 妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。
  • 题意

分别将各类菜品,单价与数量相乘然后相加。

  • 思路

多次输入一个字符串和两个实数,将两个实数相乘相加。

  • 细节

注意保留一位小数。

  • 源代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a;
    double x,y,sum=0;
    while (cin>>a>>x>>y)
    {
        sum+=x*y;
    }
    printf("%.1lf\n",sum);
    return 0;
}

 

 

Problem 14(第二套1005

  • 把一个偶数拆成两个不同素数的和,有几种拆法呢?
  • 思路

先写一个判断素数的函数。因为输入的是偶数,所以i从2开始循环到偶数的一半减一,判断i是否为素数,再定义一个数为偶数减去是素数的i,再次判断它是否为素数即可,如果是,就+1。

  • 细节

用bool 类型定义函数

  • 源代码

#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
using namespace std;
bool sushu(int n)
{
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return false;
return true;
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
int sum=0;
for(int i=2;i<n/2;i++)
{
if(sushu(i))
{
int a;
a=n-i;
if(sushu(a))
sum++;
}
}
cout<<sum<<endl;
}
}
}

 

 

Problem 15(第二套1007

  • 有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
    例如:
    x + y = 9,x * y = 15 ? 找不到这样的整数x和y
    1+4=5,1*4=4,所以,加起来等于5,乘起来等于4的二个整数为1和4
    7+(-8)=-1,7*(-8)=-56,所以,加起来等于-1,乘起来等于-56的二个整数为7和-8
  • 题意

输入数据为成对出现的整数n,m(-10000<n,m<10000),它们分别表示整数的和与积,是否有这样的整数。

  • 思路

直接将i从-10000循环到10000,定义一个数为和减去i,再判断乘积是否为输入的积。

  • 源代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
while (cin>>n>>m)
{
    if(n==0&&m==0)
    break;
    int a=0;
    for(int i=-10000;i<10000;i++)
    {
        int j;
        j=n-i;
        if(i*j==m)
        a=1;
    }
    if(a==0)
    cout<<"No"<<endl;
    else
    cout<<"Yes"<<endl;
}
return 0;
}

 

 

 

 

 

 

 

 

  •  

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值