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

班级:数学4班                     学号:2018212756

报告人姓名:吴祥龙

实验地点:东校区教学楼414

完成起止日期:2018.12.27—2019.01.04

1.Problem A
题目:给出多组数据,根据数据所在范围划分等级。
解题思路:
    用if条件语句判断数据所在范围,注意输入数据为多组,所以用while-scanf语句进行循环,另注意题目要求输出格式。
源码:
#include <stdio.h>
#include<stdlib.h>
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
if(t>=0&&t<=59)printf("E\n");
        if(t>=60&&t<=69)printf("D\n");
if(t>=70&&t<=79)printf("C\n");
if(t>=80&&t<=89)printf("B\n");
if(t>=90&&t<=100)printf("A\n");
if(t>=101||t<0)printf("Score is error!\n");
}
return 0;
}
2.Problem B
题目:给出多组数据,判断数据是否为“水仙花数”(“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身)。
解题思路:
    C语言中用pow(a,b)表示次方,而不是a^b,因为该题已经给出数据的次幂为立方,所以可以用a*a*a表示,也可以用pow(a,3)表示,但需要加头文件#include<math.h>。多组数据,用while-scanf语句进行循环。另注意不存在水仙花时输出的是“no”全为小写,存在多个时从小到大排列在一行内输出,且之间用一个空格隔开。
源码:
#include <stdio.h>
int main()
{
int m,n,a,b,c,s,sum=0;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(s=m;s<=n;s++)
{
a=s/100;
b=(s-a*100)/10;
c=s%10;
if(s==a*a*a+b*b*b+c*c*c)
{
if(sum==0)printf("%d",s);
if(sum!=0)printf(" %d",s);sum++;
}
}
if(sum==0)printf("no");
printf("\n");
sum=0;
}
return 0;
}
3.Problem C
题目:给出多组数据,求数据中奇数的乘积。
解题思路:
    用while-scanf语句输入数据,然后判断数据的奇偶性用if条件语句求余方式判断,即if(m%2==0)为偶数,数据不处理;if(m%2!=0)为奇数,进行相乘。可定义一整数型S=1,用S=S*m进行乘法运算,最后输出S。注意S的定义再循环内定义,若再循环外定义,S在进行第二次循环时不一定还为1。
源码:
#include <stdio.h>
int main()
{
    int n,i,m,s;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            if(m%2!=0)s=s*m;
        }
        printf("%d",s);
        s=1;
        printf("\n");
    }
return 0;
}
4.Problem E
题目:输入数据由2行组成,首先是一个正整数m表示测试实例的个数,第二行包含m个正整数,求该多项式的前n项的和。多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...
解题思路:
多项式中有负数,用pow(-1,x)来判断正负,多项式为分式的相加减,分母为x,分子为(-1)的x+1次方,x为多项式的项数。注意输出结果保留2位小数,所以要定义double或float输出时用%.xlf来确定保留位数x。
源码:
#include <stdio.h>
#include<math.h>
int main()
{
    int m,n,i,j;
    double s,a;
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&n);
        s=0;
        for(j=1;j<=n;j++)
        {
            a=pow(-1,j+1);
            s=s+a/j;
        }
        printf("%.2lf",s);
        printf("\n");
    }
    return 0;
}
5.Problem G
题目:给出多组数据,对每组数据去掉最高分最低分,分别求剩余数据的平均值,输出平均值,要保留二位小数。
解题思路:
    根据题目要求需要判断数据的大小,可以用if(a>b){t=a;a=b;b=a}进行排序也可用sort函数进行排序,sort函数使用时要加头文件#include<algorithm>以及using namespace std;语句,sort函数将数据从小到大排列。结果要保留小数,所以定义double或者float。另平均分为剩余数据和与剩余数据个数的商,即平均分=剩余数据和/剩余数据个数。
源码:
#include <stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,j,i;
    double d,s,a[105];
    while(scanf("%d",&n)!=EOF)
    {
        s=0;
        d=0;
        for(i=1;i<=n;i++)
        {
            scanf("%lf",&a[i]);
        }
        sort(a,a+n+1);
        for(j=2;j<=n-1;j++)
        {
            s=s+a[j];
        }
        d=s/(n-2);
        printf("%.2lf",d);
        printf("\n");
    }
    return 0;
}
6.Problem H
题目:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?n=0时结束,不作处理。
解题思路:
    多组数据,用while-scanf语句输入,小母牛从第四年才开始生牛,前四年母牛数可以确定,直接可以输出,从第五年开始母牛数有规律,即今年的母牛数=去年的母牛数+前年的母牛数,定义一个数组a[60]来表示母牛数,用循环语句计算每年母牛数,最后输出第n年的数目。题目要求n=0时结束,再循环内用条件语句判断n是否为0,若是结束循环,若不是继续进行循环。
源码:
#include<stdio.h>
int main()
{
    int n,a[60],i;
    a[1]=1;
    a[2]=2;
    a[3]=3;
    a[4]=4;
    for(i=5;i<=60;i++)
    {
        a[i]=a[i-1]+a[i-3];

}
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        printf("%d",a[n]);
        printf("\n");
    }
    return 0;
}
7.Problem I
题目:输入n个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。n=0表示输入数据的结束,不做处理。
解题思路:
    题目要求按绝对值从大到小排列,所以不能使用sort函数,只能用if(a>b){t=a;a=b;b=a}进行排序,C语言中绝对值不能用|a|,要使用fabs函数,使用时加头文件#include<math.h>,输入多组数据,用while-scanf语句输入,再循环开始判断n的值。
源码:
#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    int i;
    int j;
    int t;
    int a[202];
     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;
}
8.Problem J
题目:有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。n和m同时为0标示输入数据的结束,本行不做处理。
解题思路:
    输入多组数据,用while-scanf语句输入,在循环开始判断n与m是否同时为0.给出的整数已经按序排列好,所以只需判断加入的整数x与给出整数的大小即可,判断出x的位置然后插入输出。注意输出时最后一个整数后面没有空格,所以不能一次输出n+1个整数,先输出n个整数+空格,在另外输出第n+1个数。
源码:
#include<stdio.h>
int main()
{
    int m,n,a[100],i;
    while(scanf("%d %d",&n,&m),m||n)
    {
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        a[0]=m;
        for(i=n;i>=0;i--)
        {
            if(a[i]>a[0])a[i+1]=a[i];
            else{a[i+1]=a[0];break;}   
        }
        for(i=1;i<=n;i++)
        printf("%d ",a[i]);
        printf("%d",a[n+1]);
        printf("\n");
    }
    return 0;
}
9.Problem K
题目:输入数据n以及n个数据。n=0表示输入的结束,不做处理。输出一个整数x表示至少需要准备的人民币张数。
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
解题思路:
    输入多组数据,用while-scanf语句输入,在循环开始判断n是否为0,要求x的最小值,先判断老师工资范围,工资减去人民币数值,同时x+1,当工资剩余为0时,输出x,x就是最小值。
源码:
#include<stdio.h>
main()
{
    int a[100],n,i,k,j,sum;
    while (scanf("%d",&n)!=EOF)
    {
        if (n==0) break;
        for (i=0,sum=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            do 
            {
                if (a[i]>=100) {sum+=1;a[i]-=100;}
                else if (a[i]>=50) {sum+=1;a[i]-=50;}
                else if (a[i]>=10) {sum+=1;a[i]-=10;}
                else if (a[i]>=5) {sum+=1;a[i]-=5;}
                else if (a[i]>=2) {sum+=1;a[i]-=2;}
                else if (a[i]=1) {sum+=1;a[i]-=1;}
            }while (a[i]!=0);
        }
        printf("%d\n",sum);
    }
}
10.Problem P
题目:求A^B的最后三位数表示的整数。(1<=A,B<=10000)说明:A^B的含义是“A的B次方”
解题思路:
    输入多组数据,用while-scanf语句输入,判断A和B是否同时为0,该题不能使用pow函数,A和B的数值有超出pow函数计算范围,所以用循环语句依次相乘得乘积,题目要求输出乘积的后三位数,所以乘积再%1000求余。
源码:
#include <stdio.h>
int main()
{
    int A,B,c,i;
    while(scanf("%d %d",&A,&B)!=EOF)
    {
        c=1;
        if(A==0&&B==0){break;}
        for(i=1;i<=B;i++)
        {
            c=(c*A)%1000;
        }
        printf("%d\n",c%1000);
    }
    return 0;
}
11.Problem Q
题目:给出两个数据,判断两个数是否为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
解题思路:
    用循环语句分别找出两个数据的真约数,用累加法求出真约数之和,一般情况下应该判断两个真约数之和分别与另外数据的大小,但太麻烦,所以我直接判断真约数之和与该数据的和与另一数据及其真约数之和的和的大小,毕竟如果是真约数,那么两者应该相等,另外注意输出的格式,“YES”“NO”皆为大写。
#include <stdio.h>
int main()
{
    int M,A,B,i,j;
    int sa,sb;
    scanf("%d",&M);
    for(i=1;i<=M;i++)
    {
        sa=0;sb=0;
        scanf("%d %d",&A,&B);
        for(j=1;j<=A;j++)
        {
            if(A%j==0)sa=sa+j;
        }
        for(j=1;j<=B;j++)
        {
            if(B%j==0)sb=sb+j;
        }
        if(sa==sb)printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
12.Problem 
题目:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
解题思路:
    阶数为0、1、2时走法显而易见,可直接用数组定义出来 ,当M>2时走法有规律,即走这一阶=走前一阶+走前两阶,直接输出即可。
源码:
#include<stdio.h>
int main()
{
    int i,j,N,M,a[41];
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
        scanf("%d",&M);
        for(j=1;j<41;j++)
        {
            a[1]=0;a[2]=1;a[3]=2;
            a[j]=a[j-1]+a[j-2];
        }
        printf("%d\n",a[M]);
    }
    return 0;
}
13.Problem U
题目:假设所有的短号都是是 6+手机号的后5位,现在,如果给你一个11位长的手机号码,找出对应的短号。
解题思路:
    这一道题非常简单,输入N然后进行N此循环,在循环内输入11位号码,进行求余,输出时再加上600000即可。注意输出时千万别Printf(“6%lld\n”,a%100000),会WrongAnswer。虽然我并不明白为啥错误。
源码:
#include <stdio.h>
int main()
{
    int N,i;
    long long int a;
    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {
        scanf("%lld",&a);
        printf("%lld\n",a%100000+6*100000);
    }
    return 0;
}
14.Problem X
题目:输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价。请输出一个精度为角的菜价总量。
解题思路:
要输入数据组,用while-scanf语句输入,在循环内进行sum+=a*b计算,a为数量,b为单价,sum为总和。这道题目也很简单,一点注意就是输入字串的时候用%s,而不是%d,而且要定义double型,而不是float。
源码:
#include<stdio.h>
int main()
{
    double a,b,sum=0;
    char c[2000];
    while(~scanf("%s %lf %lf",&c,&a,&b))
    {
        sum+=a*b;
    }
    printf("%.1lf\n",sum);
    return 0;
}
15.Problem 
题目:每行包含一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则表示所做出来的样板三角形已经够了。
解题思路:
    这一道题是相当坑的,题目中充满陷阱,每个样板三角形之间应空上一行,三角形的中间为空,行末没有多余的空格。我们平时做的图形题对于行末没有硬性要求,而这道题不同,他硬性规定行末没有空格,也就是说输出字符后直接换行,最后一行用getchar()进行换行,这里要重点注意,遇到@字符结束,要在循环内用条件语句判断,我用的是if语句if(m=='@'),注意一定要加'',要不然编辑错误,没告诉我们有几组数据,所以用while-scanf语句输入。 
源码:
#include<stdio.h>
int main()
{
    int n,i,j,flag=0;
    char m;
    while(scanf("%c %d",&m,&n)!=EOF)
    {
        if(m=='@')break;
        if(flag)printf("\n");
        flag=1;
        getchar();
        for(i=0;i<n;i++)
        {
            for(j=0;j<i+n;j++)
            {
                if(j==n-i-1||j==n+i-1||i==n-1)printf("%c",m);
                else printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

总结

在解决问题时,应先理清思路,注意细节编写代码,在代码出现问题时,可在重要的步骤中添加输出,分析是哪一步出现错误,若是有超时的情况,尽量简化代码运算步骤,上网查询别人的代码借鉴一下思路,如第15题,若是将小于c的小区间合并,再分别判断最短用时,对大部分的情况都是可以满足的,但并不意味这没有错误。又如倒序输出一段数,若是依照一般的想法,求出每一位数再输出,将会非常麻烦,但运用循环只需要除10和余10两个代码循环就能完成。借鉴不意味着抄袭,借鉴的是思路,并不是说复制下来代码就会做相应的题目。C语言的学习在一点点累积,在解决题目时多思考,不需要大量背诵和死记硬背。C语言的学习还在进行中,之后还会再学习函数,指针等,还需要继续努力。

吴祥龙-2018212756相关推荐

  1. 用Python进行诗歌接龙

    目录 实现原理 建立诗歌语料库 诗歌分句 诗歌接龙 测试运行 之前讲解过人工智能对对联项目,本文将展示如何利用Python爬虫来实现诗歌接龙.

  2. 6000毫安以上智能手机_6000大电池+骁龙8核处理器,Redmi新机来袭:价格太美

    11月26日的晚上,小米在北京科技园一口气发布了三款智能手机,一款智能手表,这些新品我都非常的关注. 之前我也给大家详细的介绍了一下Redmi Note9 版系列的5G版本,接下来的时间,我们再来聊一 ...

  3. 拇指接龙游戏升级记录03(升级MainScene.cpp)

    MainScene是拇指接龙游戏的主游戏场景文件,拥有近5000行代码. 说实在的,实现自cocos2d-x 2.x版本向当下最新的3.8.1版本的升级过程,其中涉及的技术不是一下能够说明的.有些是形 ...

  4. 中国电子学会图形化四级编程题:成语接龙

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 我们将有关编程题目的教学视频已经发布到抖 ...

  5. 【青少年编程】【四级】词语接龙

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  6. 龙蜥降世,神龙升级,阿里云投入 20 亿发力操作系统

    作者 | 贾凯强.伍杏玲 出品 | AI科技大本营(ID:rgznai100) 10 月 20 日,阿里巴巴云栖大会继续在杭州进行,与开幕第一天的主论坛不同,第二天活动的主论坛更加聚焦与技术领域和技术 ...

  7. 龙芯架构应用迁移技术分享——搜狗输入法应用迁移

    技术引领创新,用"芯"构建生态,第一期龙芯生态论坛将于2021年3月12日(周五)盛大开讲!龙芯生态论坛作为龙芯生态建设的重要技术交流窗口,将汇聚龙芯资深技术专家及行业生态伙伴精英 ...

  8. AI一分钟 | 小米MIX 2S将于3月27号发布,搭载骁龙845;张朝阳:在研究区块链 但相信AI的力量

    一分钟AI 华为确认P20系列即将登陆巴黎,AI加成拍照功能更出色 张朝阳:在研究区块链,但相信AI的力量 Waymo无人车新专利,根据乘客身体状况选择合适的路线,可为易晕车乘客选择平坦路线 新款 A ...

  9. 【每日一算法】单词接龙

    微信改版,加星标不迷路! 每日一算法-单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规 ...

最新文章

  1. 【程序员比赛】CISCN 2021 ezj4va与Fix思路
  2. 前端笔记-js文件首行添加;号(前端小技巧)
  3. 初中数学抽象教学的案例_初中八年级数学上册教学视频汇总
  4. 实验一 命令解释程序的编写
  5. 在单用户模式下启动SQL Server的不同方法
  6. 这十大挑战,摆在DL面前:马库斯长文质疑深度学习
  7. 对于基于模板的前端框架的补充
  8. hexo+github
  9. 打开含avi格式视频文件的文件夹“死机”问题的解决
  10. 11gR2数据库RMAN完全恢复数据库
  11. AOSP ~ 默认开启开发者模式
  12. 一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider...
  13. 数据仓库多维数据模型设计
  14. SDOI2018 一轮培训划水祭
  15. Java Web安全之代码审计
  16. JAVA JNI调用科大讯飞离线语音合成(Linux篇)
  17. 由“三姬分金”到“海盗分金”
  18. Set 直接转成 数组
  19. MOSFET开通特性(2)——动态特性
  20. Python爬取《冰雪奇缘2》豆瓣影评

热门文章

  1. Messagebox自定义计时关闭
  2. MATLAB算法实战应用案例精讲-【自动驾驶】激光雷达LiDAR(补充篇)
  3. mac os系统复制粘贴ctrl+c ctrl+v快捷键实现方式
  4. 百度文库中在线阅读器的基本思想
  5. 大数据统计租房市场现状(北京篇)
  6. 基于SpringBoot/SSM的最新最轻量级最漂亮的的二手房屋交易系统RentUP
  7. 微信开发 - 公众号授权登录方案(含跳转关注公众号)
  8. 在共享网盘关闭之前搭建自己的私有云—Nextcloud (图文教程)
  9. Python—海龟作图
  10. 教你实现仿酷狗播放器(附源码)