算法竞赛的目的是找到解决问题的答案,不是比谁的答案更高级!!!
目录
一、圆柱体的表面积
这个是中小学生都知道的的答案,底面积 x 2 加上 侧面积为表面积,我们令圆柱体的地面半径为r,高为h
则该圆柱体的表面积的表达为 PI * r * 2 + 2 PI * r
问题描述:输入底面半径r,和高度h,输出圆柱的表面积,保留三位小数
样例:
3.5 9
Area = 274.889
#include<stdio.h>
#include<math.h>
int main()
{
const double pi = acos(-1.0);
double r,h,s1,s2,s;
scanf("%lf%lf",&r,&h);
s1 = pi*r*r;
s2 = 2*pi*r*h;
s = s1*2+s2;
printf("Area = %.3f",s);
return 0;
}
这里要注明几点,const 关键字表明 PI 的值是不可改变的,这里的 pi 在真正的意义上属于一个常量,一般声明常量用const 关键字即可
double表示双精度浮点数,它能比float更加精准的表示小数点后面的数
二、给一个三位数,讲其逆序输出
示例:
样例输入
123
样例输出
321
源代码
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("%d%d%d",n%10,n/10%10,n/100);
return 0;
}
但是这样当我们输入120的是时候,电脑会输出021,虽然这么表达也感觉不像错的,但是这样并不符合数学的规范写法,如果这样,我们就必须判断 n%10 是否为0 ,但也有另一个办法,将输出得到的值存储到一个变量中,然后再用%d输出,如果还要输出025,将%d 改为 %03d
#include<stdio.h>
int main()
{
int n,m;
scanf("%d",&n);
m = (n%10)*100 + (n/10%10)*10 +(n/100);
printf("%d",m);//%d 改成 %03d即可得到和上述一样的结果
return 0;
}
三、 变量交换
问题描述:输入两个数字,输出时将这两个数字的位置交换
示例
样例输入:
23 24
样例输出:
24 23
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d %d",b,a);
return 0;
}
/*方法二
a = a + b;
b = a - b;
a = a - b;
方法三
a=a^b;
b=a^b;
a=a^b;
方法四
int t;
t = a;
a = b;
b = t;
*/
这个交换数据的题目还有两种,一种使用指针,还有是用函数,在算法竞赛中,只要找到解决问题的办法,就是好方法
四、鸡兔共笼
问题描述:鸡和兔的数量有 n 只,总腿数 有 m,输入n,m,输出鸡的数目,兔的数目
示例
样例输入
14 32
样例输出
12 2
样例输入
10 16
样例输出
No answer
问题思考:我们假设鸡有 a 只,兔有 b 只,a + b = n,2a+4b = m,还有a和b都是整数并且大于0,还有兔和鸡的腿数都为偶数,所以m也一定为偶数
#include<stdio.h>
int main()
{
int a,b,n,m;
scanf("%d%d",&n,&m);
a = (4*n-m)/2;
b = n - a;
if(m%2 == 1||a<0||b<0)
printf("No answer");
else
printf("%d %d\n",a,b);//a is chicken,b is rabbit
return 0;
}
五、三整数排序
问题描述: 输入三个整数,将其从小到大排序
示例
样例输入:
13 22 21
样例输出
13 21 22
问题思考:三个数字进行排序,有一种中间情况,当我们输入的三个数字恰好都相同呢?其实在判断条件中加入相等就可以了,我就直接把代码放出来就好了
#include<stdio.h>
int main()
{
int i,j,k,t;
scanf("%d%d%d",&i,&j,&k);
if(i>j)
{
t = i;
i = j;
j = t;
}
if(i>k)
{
t = i;
i = k;
k = t;
}
if(j>k)
{
t = j;
j = k;
k = t;
}
printf("%d %d %d\n",i,j,k);
return 0;
}