noi-oj刷题记录第一弹1001-1020


noi-oj 意为 全国青少年信息学奥林匹克竞赛-算法

初中的时候比过,那时候没比好。跟个憨包一样。于是现在回过头来刷刷题,记录一下

  • 1001

1001

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
float a; //定义float类型名为a的变量
scanf("%f",&a); //接受一个浮点型的变量
printf("%.4lf",(a-32)*5/9); //.4lf为保留4位小数的lf长整形输出控制符,后面那一串即是华氏转摄氏的公式
return 0;
}


  • 1002

    1002
    这题用海伦公式求解,所以贴张海伦公式的图片
    海伦公式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include<stdio.h>
    #include<math.h>
    int main()
    {
    float a,b,c,p; //定义4个float类型的变量
    scanf("%f%f%f",&a,&b,&c); //接受传来的三个值
    p=(a+b+c)/2; //海伦公式的p(三角形的半周长)
    printf("%.4lf",sqrt(p*(p-a)*(p-b)*(p-c))); //海伦公式的S(三角形的面积),已保留4位小数
    return 0;
    }


  • 1003

    1003
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdio.h>
    int main()
    {
    int num; //定义一个int类型的整数
    scanf("%d",&num); //接受一个int类型的数
    printf("%d",(num*1000+num)/1001);
    //由467->467467 。只需要把467*1000+467即可。
    // 11->1111 只需要把11*100+11j即可。
    // 规律就是如果一个数要加在同一个数后。直接把此数乘上自己+1位数的10位数倍就可以
    //1001 即是把题目 7*11*13=1001
    return 0;
    }



  • 1004

    1004
1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{

long n,m,a;
//用long是因为题目数据
scanf("%ld %ld %ld",&n,&m,&a);
printf("%ld\n",(n/a)*(m/a));
//默认用 / 号就是整除的,往小的地方取数。
//原理就是把矩形两边的数跟正方形的边除。得到一个可以的范围。在把另一边也进行除计算,在把两个结果乘起来
return 0;
}

  • 1005

    1005
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <math.h>
    int main()
    {
    float R,X,P; //定义三个浮点数
    scanf("%f %f %f",&R,&X,&P); //接受三个数
    printf("%.2f",pow((100+R)/100, P)*X); //直接进行计算。pow是乘方
    return 0;
    }

  • 1006

    1006
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
int a,b,c; //定义三个整数
scanf("%d %d %d",&a,&b,&c); //直接接受三个整数
printf("%d",20-(a+b+c)); //用20减去三个数的合,就是最后一个石头的重量
return 0;
}


  • 1007

    1007
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    int main()
    {
    float a,b,c;
    scanf("%f %f",&a,&b);
    printf("%.2f",a-b*(int)(a/b));
    //余数=被除数-除数 ×商
    //a/b算出商。在用除数×商
    //余数定义参考:https://baike.baidu.com/item/%E4%BD%99%E6%95%B0/6180737?fr=aladdin
    return 0;
    }

  • 1008

    1008
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
    #include <math.h>
    int main()
    {
    int n;
    scanf("%d",&n);
    if (pow(n%10,3)+pow(n/10%10,3)+pow(n/100,3)==n)
    //通过n%10取到个位,通过n/10%10取到十位,n/100取到百位,在把每一位的三次方相加与n比较
    {
    printf("YES");
    }
    else
    {
    printf("NO");
    }
    return 0;
    }


  • 1009

    1009
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    int main()
    {
    int b,g;
    scanf("%d %d",&b,&g);
    if(b+g<10) //第一种情况男女总和小于10
    {
    printf("water");
    }
    else if(b+g>=10&b>g) //总人数大于等于10且男生多于女生
    {
    printf("tree");
    }
    else if(b+g>=10&b<=g) //总人数大于等于10人且男生不多于女生(不多于)
    {
    printf("tea");
    }
    return 0;
    }

  • 1010

    1010
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h>
    int main()
    {
    float weight;
    scanf("%f",&weight);

    if(weight<=10)
    {
    printf("%.2f",weight*0.80+0.20); //直接计算第一个段
    }
    else if(10<weight&weight<=20)
    {
    printf("%.2f",(weight-10)*0.75+8.20); //分段计算。把第一段的8和0.2已经加上
    }
    else if(20<weight&weight<=30)
    {
    printf("%.2f",(weight-20)*0.70+15.70); //分段计算。第一段的8+第二段的7.5+0.2
    }
    else
    {
    printf("Fail");
    }
    return 0;
    }

  • 1011

    1011
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
    int main()
    {
    float x,y;
    scanf("%f %f",&x,&y);
    if(x<=1&x>=-1&y<=1&y>=-1)
    //画个图,直接看出来,如果需要在正方形内的话。就要判断两边的条件
    //也可以把y的条件写在下面
    {
    printf("Yes");
    }
    else
    {
    printf("No");
    }
    return 0;
    }

  • 1012

    1012
    这题有应用到ascii,所以贴上ascii码表
    ascii
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include  <stdio.h>
    int main()
    {
    int n;
    scanf("%d",&n);
    if(n%123>=97&n%123<=122)
    //第一个摸123,判断是否大写
    {
    printf("%c",n%123); //用%c来转换
    }
    else if(n%91>=65&n%91<=90)
    //第二个摸91,判断是否小写
    {
    printf("%c",n%91); //用%c来转换
    }
    else
    //判断是否可变换大小写,最后一种情况
    {
    printf("*");
    }
    return 0;
    }

  • 1013

    1013
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    #include <math.h>
    int main()
    {
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    if(a+b>c&&a+c>b&&b+c>a)
    //判断是否能构成三角形
    {
    if(a==b && b==c)
    //判断是否是等边三角形
    {
    printf("Equilateral");
    }
    else if(pow(a,2)+pow(b,2)==pow(c,2) || pow(b,2)+pow(c,2)==pow(a,2) || pow(a,2)+pow(c,2)==pow(b,2))
    //用两边平方是否等于第三条边来判断是否为直角三角形
    {
    printf("Right");
    }
    else
    //其它三角形
    {
    printf("General");
    }
    }
    else
    {
    printf("NO");
    }
    return 0;
    }

  • 1014

    1014
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <stdio.h>
    int main()
    {
    //输入某学生成绩score,根据成绩好坏输出相应评语。如果成绩在大于等于90,输出“Excellent”;
    //如果成绩在大于等于80分且小于90分,输出“Good”;
    //如果成绩大于等于60分且小于80分,输出“Pass”;
    //成绩小于60分,输出“Fail”。
    int score;
    scanf("%d",&score);
    if(score>=90)
    {
    printf("Excellent");
    }
    else if(score>=80&&score<90)
    {
    printf("Good");
    }
    else if(score>=60&&score<80)
    {
    printf("Pass");
    }
    else
    {
    printf("Fail");
    }



    return 0;
    }


  • 1015

    1015
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
    int main()
    //输入数字1~7的表示星期一至星期日,输出对应的星期几的英文名称。
    //如果是1,输出Monday;
    //如果是2,输出Tuesday;
    //如果是3,输出Wednesday;
    //如果是4,输出Thursday;
    //如果是5,输出Friday;
    //如果是6,输出Saturday;
    //如果是7,输出Sunday;
    //通过数组的方式,直接输入多少就直接取出第几个数,因为数组第一位为0。所以需要把第一个补空。第二个开始才是星期一。
    {
    int d;
    char *days[]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
    scanf("%d",&d);
    printf("%s",days[d]);
    return 0;
    }

  • 1016

    1016
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    int main()
    {
    int year,month;
    scanf("%d%d",&year,&month);
    if(year%4==0 && year%100!=0 && month==2 || year%400==0 && month==2)
    //1、能被4整除,但不能被100整除;2、能被400整除;
    {
    printf("29");
    }
    else
    //非闰年的情况 , 用分支直接进行判断
    {
    if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
    {
    printf("31");
    }
    else if(month==4 || month==6 || month==9 || month==11)
    {
    printf("30");
    }
    else
    {
    printf("28");
    }
    }
    return 0;
    }



  • 1017

    1017
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    int main()
    //编程实现以下功能:查询水果的单价。有4种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄(grapes),
    //单价分别是3.00元/公斤,2.50元/公斤,4.10元/公斤和10.20元/公斤。
    //运行程序后,首先在屏幕上显示以下菜单(编号和选项)(见样例)。
    //当用户输入编号1~4,显示相应水果的单价(保留1位小数);输入0,退出查询;输入其他编号,显示价格为0。
    {
    printf("[1] apples\n[2] pears\n[3] oranges\n[4] grapes\n[0] Exit\n");
    float fruits[]={0,3.0,2.5,4.1,10.2};

    int num;
    scanf("%d",&num);
    if (num>=0&&num<=4)
    //判断输入的数在不在0-4之间
    {
    if(num==0)
    {
    return 0;
    }
    printf("price=%.1f",fruits[num]);
    }
    else
    //特殊情况
    {
    printf("price=0");
    }
    return 0;
    }

  • 1018

    1018
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main()
//某市的IC卡电话计费标准如下:首次为0.5元/3分钟(不足3分钟按3分钟计费),之后是0.2元/1分钟,不足一分钟按一分钟来算,
//如一个人打了6分30秒,那计费是按照7分钟来算,花费为1.3元。已知某人打一次电话花费为x元,
//问这个人有可能打了多长时间的电话?(精确到分钟)
{
float x;
int time;
scanf("%f",&x);
if(x<=0.5)
//第一种3分钟的情况
{
printf("3");
}
else
{
x=(x-0.5)/0.2+3;
//超过三分钟
printf("%.0f",x);
}
return 0;
}

  • 1019

1019

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
double x;
scanf("%lf",&x);
if(x<5)
{
printf("%0.3lf",x+2.5);
}
else if(x<10)
{
printf("%0.3lf\n",2-1.5*(x-3)*(x-3));
}
else
{
printf("%0.3lf",x/2-1.5);
}
return 0;
}

  • 1020

    1020
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <string.h>
    int main()
    {
    int a,b;
    int i;
    scanf("%d",&a);
    b=a;
    for(i=0;a>0;i++)
    {
    a=a/10;
    }
    printf("%d\n",i);
    if(i==4)
    //千位 一个一个取
    {
    printf("%d\n%d\n%d\n%d\n",b/1000,b%1000/100,b%1000%100/10,b%1000%100%10);
    }
    else if(i==3)
    //百位
    {
    printf("%d\n%d\n%d",b/100,b%100/10,b%100%10);
    }
    else if(i==2)
    //十位
    {
    printf("%d\n%d",b/10,b%10);
    }
    else
    //个位直接打印就可
    {
    printf("%d",b);
    }
    return 0;
    }