002圆及圆球等的相关计算(我的001题是计算A+B,过于基础了所以没在这里写)
这道题其实也很基础,贴在这里是想说几个小点,也是当时我漏下的地方。
π的值不能直接设置为3.14,精确度不够;因此我用了<math.h>里的acos(-1.0),这样可以直接计算出π,精确度也达到了;但一定要在前面include<math.h>(如果没有include,codeblocks里可以正常运行,但是noj上运行不了,会编译错误);
保留两位小数浮点数格式为 %.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 是该年的第几天?
这道题其实是有隐藏条件的;
需要判断是否为闰年
每个月份的天数不一样,闰年中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