noj(水题)2-10

002圆及圆球等的相关计算(我的001题是计算A+B,过于基础了所以没在这里写)

这道题其实也很基础,贴在这里是想说几个小点,也是当时我漏下的地方。

  1. π的值不能直接设置为3.14,精确度不够;因此我用了<math.h>里的acos(-1.0),这样可以直接计算出π,精确度也达到了;但一定要在前面include<math.h>(如果没有include,codeblocks里可以正常运行,但是noj上运行不了,会编译错误);

  1. 保留两位小数浮点数格式为 %.2f (这个牵扯到printf格式说明域:%[flags] [width] [.prec] [h|l|L|F|N] type; type就是f,这里.2是属于[.prec]精度说明的,意思就是保留两位小数)

第二题解题代码如下,这里就不再逐行解释说明了。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi acos(-1.0)

int main()
{
    float r,h,l,s,sq,vq,vz;
    scanf("%f%f",&r,&h);
    l=2*pi*r;
    s=pi*r*r;
    sq=4*pi*r*r;
    vq=sq*r/3;
    vz=s*h;
    printf("%.2f\n%.2f\n%.2f\n%.2f\n%.2f\n",l,s,sq,vq,vz);
    return 0;
}

003计算成绩

这道题想说的是实型问题,输入要求是实型,虽然从Sample Input看可以是整形,但是由于输出要求是实型,所以如果一开始输入的三个成绩定义为int类型,那么求sum和average的时候,就牵扯到了类型转换,就有可能会出错。

代码附在下方了,不多解释。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float math,english,c,sum,average;
    scanf("%f%f%f",&math,&english,&c);
    sum = math+english+c;
    average = sum/3;
    printf("%f\n%f\n",sum,average);
    return 0;
}

004找最大数

这道题只有三个数,所以比较好写,解法也有很多种,我第一次写的时候是用的老师讲的思路,思路就是每一次比较后都会把A变成相对大的那个,所以比较两次就可以了,只不过需要一个中间变量t,去实现两两交换,但其实题目没有要求保留三个数的原始值,貌似可以直接赋值一次;

代码如下:

#include <stdio.h>
int main()
{
    int A,B,C,t;
    scanf("%d%d%d",&A,&B,&C);
    if (A<=B) t=A,A=B,B=t;
    if (A<=C) t=A,A=C,C=t;
    printf("%d",A);
    return 0;
}

我觉得也可以这么写,就是利用一个max值,依次与这三个数比较,反正只有三个数,代码写起来并不困难,如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b,c,max=-10000;
    scanf("%d%d%d",&a,&b,&c);
    if(a>max) max=a;
    if(b>max) max=b;
    if(c>max) max=c;
    printf("%d",max);
    return 0;
}

005找幸运数

这题主要是解决如何实现整数逆序的问题,所以就需要% 、/计算;

1.因为整数的位数不确定,所以要利用循环结构,利用循环条件判断是否结束。

2.最后利用分支结构,比较过后实现输出是否为幸运数。

对于要点1,我们可以每次对整数N%10,这样记录的就是N的最低位,把这个赋值给另一个整数(假设是M),然后再执行N=N/10,因为N是整型,所以N这时是去掉最低位后的剩余位数,然后循环条件是判断N是否为0(如果N为0的话,证明N的最高位已经全为0了,也就是N的所有位数都已经翻转给M了);

用1234来举例说明是这样的;(还要注意的是,M的初始值要为0,不然会被分配一个数,这样第一次循环执行时,M*10就不为0,就会出问题)

第一次,M = M*10 +N%10;(M*10为零,执行语句后M此时为4);然后N=N/10;(N此时为123),条件成立,执行下次循环;

第二次,M = M*10 + N%10;(M*10是为了将上次提取的低位变为高位,然后再加上新提取的低位,实现N的位数翻转;此时M是43);然后N=N/10;(N此时为12),条件成立,执行下次循环;

第三次,M = M*10 + N%10;(M此时为432);然后N=N/10;(N此时为1),条件成立,执行下次循环;

第四次,M = M*10 + N%10;(M此时为4321);然后N=N/10;(N此时为0),条件不成立,退出循环;

实现这一要点的代码如下:

while(N != 0)
    {
        M = M*10 + N%10;
        N = N/10;
    }

对于要点二,其实比较简单,就是比较原数与翻转数即可,成立则输出“yes”不成立则输出“no”,但是要注意,刚刚要点一执行的时候,我们把N记录的原数已经变为了0,所以我们一开始要单独定义一个变量,把N的值给这个变量,所以比较的时候,就可以实现原数与翻转数比较了。还要注意的是比较是否相等要利用“==”或“!=”而不是“=”;

总代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int N, M = 0,tep;
    scanf("%d",&N);
    tep = N;
    while(N != 0)
    {
        M = M*10 + N%10;
        N = N/10;
    }
    if(M == tep)
    {
        printf("yes");
    }
    else
    {
        printf("no");
    }
    return 0;
}

006 奖金发放

这道题属于是if....else if....的罗列了...就是注意看好利润怎么算就行了,代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float I,money = 0;
    scanf("%f",&I);
    if(I<=10)
    {
        money = I*0.1;
    }
    else if(I<=20)
    {
        money = 1 + (I-10)*0.075;
    }
    else if(I<=40)
    {
        money = 1.75 + (I-20)*0.05;
    }
    else if(I<=60)
    {
        money = 2.75 + (I-40)*0.03;
    }
    else if(I<=100)
    {
        money = 3.35 + (I-60)*0.015;
    }
    else
    {
        money = 3.95 + (I-100)*0.01;
    }
    printf("%f",money);
    return 0;
}

007 出租车费

这道题比上面那道题判断条件上简单些,但是关键在于不足1公里按照1公里收费这句,意味着我们需要向上取整,就是说1.2当成2来计算,如果用类型转换的话(就是强制int),1.2会被当做1,所以如何解决呢,简单说一下思路。

判断(int)x 是否与x相等,如果不相等,那么说明x是需要向上取整的,所以令一个整数(假定为X)X=(int)(x+1)这样就实现了x向上取整后赋值给了X,利用X计算就可以了。如果相等,那么直接利用x即可。

为了简化main函数,所以单独写了一个int f(float x)函数,实现向上取整功能,代码如下:

#include <stdio.h>
#include <stdlib.h>

int f(float x)
{
    int X;
    if((int)x!=x)  X = (int)(x+1);
    else  X =(int)x;
    return X;
}

int main()
{
    float distance,money;
    scanf("%f",&distance);
    if(distance<=2)
    {
        money = 7;
    }
    else if(distance<=15)
    {
        money = 7 + f(distance-2)*1.5;
    }
    else
    {
        money = 26.5 + f(distance-15)*2.1;
    }
    printf("%f",money);
    return 0;
}

008 是该年的第几天?

这道题其实是有隐藏条件的;

  1. 需要判断是否为闰年

  1. 每个月份的天数不一样,闰年中2月份天数也不一样

闰年的判断条件是,可以被4整除但不能被100整除,或是能被400整除的年份;

月份的累积可以利用Switch函数来写

提示到此,代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int year,month,day,sum = 0;
    scanf("%d-%d-%d",&year,&month,&day);
    switch(month-1)
    {
        case 11:sum = sum + 30;
        case 10:sum = sum + 31;
        case 9:sum = sum + 30;
        case 8:sum = sum + 31;
        case 7:sum = sum + 31;
        case 6:sum = sum + 30;
        case 5:sum = sum + 31;
        case 4:sum = sum + 30;
        case 3:sum = sum + 31;
        case 2:
            {
                if(( year%4==0 && year%100!=0 )|| year%400==0 )
                    sum = sum + 29;
                else sum = sum +28;
            }
        case 1:sum = sum + 31;
    }
    sum = sum + day;
    printf("%d",sum);
    return 0;
}

009 成绩转换

这个比前两道题都简单,不细说了,代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int score;
    scanf("%d",&score);
    if(score<60)
        printf("E");
    else if(score<=69)
        printf("D");
    else if(score<=79)
        printf("C");
    else if(score<=89)
        printf("B");
    else  printf("A");
    return 0;
}

010 求建筑高度

这个一看到四个圆塔非常对称,关于x,y,原点都对称,所以我直接用了int abs(int n)函数(包含在<math.h>里的)求绝对值,然后判断是否在圆内,就是利用数学知识,减去圆心坐标后,对x,y的平方和与半径的平方作比较。

解释一下代码中x = abs(x) - 2 ;实际上是先将x原始值变为绝对值(这样坐标就位于第一象限了),而abs(x)-2是已经处于第一象限的坐标与圆心的x坐标相减,后续求平方和的时候,式子就可以简单一点。

总代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int x,y,h = 0,s;
    scanf("%d,%d",&x,&y);
    x = abs(x)-2;
    y = abs(y)-2;
    s = x*x+y*y;
    if(s<=1)
        printf("%d",h+10);
    else
        printf("%d",h);
    return 0;
}

新手上路,编写不易,欢迎指正,多多支持。/doge

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值