算法竞赛入门经典(第二版)答案——第一部分

​第一章程序设计入门

  1. /输入三个平均数,输出他们的平均值,保留三位小数/
#include<stdio.h>
int main()
{
    double a,b,c;
    scanf("%lf%lf%lf",&a,&b,&c);
    printf("%.3lf",(a+b+c)/3);

    return 0;
}
  1. /输入华氏温度f,输出对应的摄氏温度从,保留三位小数。提示 c= 5(f-32)/9/
#include<stdio.h>
int main()
{
    double c,f;
    scanf("%lf",&f);
    c = 5*(f-32)/9;
    printf("%.3lf",c);

    return 0;
}

3./输入正整数n,输出1+2+3+…n的值,提示:目标使解决问题,而不是练习编程*/

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

    return 0;
}
  1. /输入正整数n(0~360),输出入n度的正弦函数值。提示使用数学函数/
#include<stdio.h>
#include<math.h>
#define pi acos(-1.0)
int main()
{
    int x;
    scanf("%d",&x);
    printf("%.3lf\n",sin(1.0*pi*x/180));
    printf("%.3lf\n",cos(1.0*pi*x/180));

    return 0;
}
  1. 一件衣服95元,若消费满300元,可以打85折。输入购买的衣服的数量,,输出索要交付的的金额,保留两位小数
#include <stdio.h>
int main() 
{
    int n;
    scanf("%d", &n);
    printf("%.2lf", 95 * n >= 300 ? 95.0 * n * 0.85 : 95 * n);
    
    return 0;
}
#include<stdio.h>
int main()
{
    const double price = 95.00;
    int n;
    scanf("%d",&n);

    if(price*n <300)
        printf("%.2f",price*n);
    else
        printf("%.2lf",price*n*0.85);

    return 0;
}
  1. 输入三角形3跳变的长度值(均为正整数),判断是否能为直角三角形的三条边长。如果可以则输出yes,如果不能就输出no。如果根本无法构成三角形,则输出not a triangle
#include<stdio.h>
int main()
{
    int a,b,c;

    scanf("%d%d%d",&a,&b,&c);
    if(a<=0||b<=0||c<=0||a+b<=c||a+c<=b||b+c<=a)
        printf("NOT A TRIANGLE!");
    else if(a+b>c&&a+c>b&&b+c>a)
        {
            if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a)
                printf("yes!");
            else
                printf("no!");
        }
    return 0;
}

  1. 输入年份,判断是否为闰年。如果是,则输出yes,否则输出no
    提示简单的判断除以4的余数是不够的
#include<stdio.h>
int main()
{
    int year;
    scanf("%d",&year);
    if(year%4!=0)
        printf("no!\n");
    else if(year%100==0 && year%400!=0)
        printf("no!\n");
    else
        printf("yes!\n");

    return 0;
}
#include <stdio.h>

int main() 
{
    int year;
    scanf("%d", &year);
    puts(year%400==0 || year%100!=0 && year%4==0 ? "yes!" : "no!");
    return 0;
}

第二章 循环结构设计

1.水仙花数
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A3 +B3 +C3 ,则称其为水仙花数。例如153=13 +53 +33 ,所以153是水仙花数。

#include<stdio.h>
int main(void)
{
    for(int i = 100;i<=999;i++)
    {
        int a = i/100;
        int c = i%10;
        int b = (i-a*100-c)/10;
        if(i==a*a*a+b*b*b+c*c*c)
            printf("%d\n",i);
    }
    return 0;
}

2. 韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。

样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer
#include<stdio.h>
int main(void)
{
    int a,b,c,i;
    //依次输入三人一排,五人,七人一排的排尾数
    scanf("%d%d%d",&a,&b,&c);
    for(i = 10;i<=100;i++)
    {
        if(i%3==a&&i%5==b&&i%7==c)
        {
            printf("Case 1:%d\n",i);
            break;
        }
    }
    if(i>100)
        printf("Case 2: No answer");

    return 0;
}

  1. 倒三角形(triangle)
    输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
#########
 #######
  #####
   ###
    #
#include<stdio.h>
int main(void)
{
    int i ;
    scanf("%d",&i);
   for(int j=0;j<i;j++)
   {
       //打印空格
       for(int k=0;k<j;k++)
        printf(" ");
       for(int k=0;k<2*i-2*j-1;k++)
        printf("#");
       printf("\n");
   }
    return 0;
}

2.4 子序列的和(subsequence)

输入两个正整数n<m<10^6 ,输出 1/n^2 + 1/(n+1)^2 +1/m^2,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。

样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.0000
#include<stdio.h>
int main() {
	int n, m;
	while(scanf("%d%d",&n,&m) && n)
        {
            double sum = 0;
            while(n <= m)
            {
                sum += 1.0/n/n; 
                ++n;
            }
		printf("%.5lf\n", sum);
	}
	return 0;
}

5. 分数化小数(decimal)

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106 ,c≤100。输入包含多组数据,结束标记为a=b=c=0。

样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
#include<stdio.h>
int main(void)
{
    int a,b,c,count=0;
    while(scanf("%d%d%d",&a,&b,&c)&&(b!=0||c!=0||a!=0))
    {
        count++;
        //.*f为占位符
        printf("Case%d:%.*f\n",count,c,(double)a/b);

    }
    return 0;
}

6.排列(permutation)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。

**下面是一些思考题。
题目1。假设需要输出2,4,6,8,…,2n,每个一行,能不能通过对程序2-1进行小小的改动来实现呢?为了方便,现把程序复制如下:
**

1  #include<stdio.h>
2  int main()
3  {
4    int n;
5    scanf("%d", &n);
6    for(int i = 1; i <= n; i++)
7      printf("%d\n", i);
8    return 0;
9  }

**
任务1:修改第7行,不修改第6行。

for(int i = 2; i<=2*n;i=i+2)

任务2:修改第6行,不修改第7行。

       printf("%d\n",i+i);

题目2。下面的程序运行结果是什么?“!=”运算符表示“不相等”。提示:请上机实
验,不要凭主观感觉回答。**

#include<stdio.h>
int main()
{
  double i;
  for(i = 0; i != 10; i += 0.1)
    printf("%.1f\n", i);  
    return 0;
}

会永远持续打印下去,为什么?因为整数和浮点数的存储方式不一样,所以不会相同。

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不好,商鞅要跑

谢谢咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值