目录
借助《算法竞赛入门经典(第二版)》第一章进行复习并练习
关于浮点数
整数值用%d输出,实数用%f输出。
整数/整数=整数,浮点数/浮点数=浮点数。
double的输出必须用%f,而输入需要用%lf
5-0.1为整数-浮点数=浮点数(但其实说法不太准确,整数先“变”成浮点数,然后浮点数-浮点数=浮点数。)
来看个例子
#include<stdio.h>
int main()
{
double a;
a = 5*(34 - 32) /9;
printf("%.1f",a) ;
return 0;
}
只通过代码进行判断输出的值是1.0
因为等号右边的数字是int,即使a是double,int的计算已经完成了是1,double之后就是1.0
若要得出1.1的结果,只需把等于号左边的某个整数变成浮点数的形式,如5改为5.0;
1.三位数反转
#include<stdio.h>
int main()
{
int n, m;
scanf("%d", &n);
m = (n%10)*100 + (n/10%10)*10 + (n/100);
printf("%03d\n", m);
return 0;
}
(要使输入250能够输出025,则把输出格式变为%03d即可)
2.鸡兔同笼问题
#include<stdio.h>
int main()
{
int a,b,n,m;
scanf("%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",a,b);
}
return 0;
}
3.三位数排序
#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; } //执行完毕之后a≤b
if(a > c) { t = a; a = c; c = t; } //执行完毕之后a≤c,且a≤b依然成立
if(b > c) { t = b; b = c; c = t; }
printf("%d %d %d\n", a, b, c);
return 0;
}
利用此方法完成作业中放箱子的题目:
#include<stdio.h>
int main()
{
int n;
int a,b,c,d,e,f;
scanf("%d",&n);
int i,t;
for(i=0;i<n;i++){
scanf("%d %d %d",&a,&b,&c);
if(a>b){
t = a;
a = b;
b = t;
}
if(a>c){
t = c;
c = a;
a = t;
}
if(b>c){
t = c;
c = b;
b = t;
}
scanf("%d %d %d",&d,&e,&f);
if(d>e){
t = d;
d = e;
e = t;
}
if(d>f){
t = f;
f = d;
d = t;
}
if(e>f){
t = f;
f = e;
e = t;
}
if((a<=d&&b<=e&&c<=f)||(d<=a&&e<=b&&f<=c)){
printf("yes\n");
}else{
printf("no\n");
}
}
return 0;
}
如果不只有三位数进行排序呢,就要用到数组了:
#include <stdio.h>
int main(void)
{
int a[1001];
int n, i, j, t;
scanf("%d", &n); //n为要排序的数的个数
//输入要排序的数
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
//接下来进行排序
for(i = 0; i < n - 1;i++) //n个数,总共需要进行n-1次
{ //n-1个数排完,第一个数一定已经归位
//每次会将最大(升序)或最小(降序)放到最后面
for(j = 0; j < n - i - 1; j++)
{
if(a[j] > a[j + 1]) //每次冒泡,进行交换
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for(j = 0; j < n; ++j)
{
printf("%-5d ", a[j]);
}
return 0;
}
4.打折
一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金 额(单位:元),保留两位小数:
#include<stdio.h>
int main()
{
const int price=95;
int number;
scanf("%d",&number);
double sum;
sum = price*number;
if(sum>=300){
sum *=0.75;
}
printf("%.2f",sum);
}
5.构成三角形
输入三角形3条边的长度值(均为正整数),判断是否能为直角三角形的3个边长。如果 可以,则输出yes,如果不能,则输出no。如果根本无法构成三角形,则输出not a triangle。
#include<stdio.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*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a)
{
printf("yes");
}
else
{
printf("no");
}
}
else
{ printf("not a triangle");
}
return 0;
}
6.是否为闰年
输入年份,判断是否为闰年。如果是,则输出yes,否则输出no
字符变量
定义字符型变量op,用于存放字符型数据,如:
字符常量:'+','-','*','/'
字符变量:op,a,b......
char op1,op2;
op1='A';
op2=op1;
单个字符的输入与输出:
注意:空格算一个字符!!!!!
不然,输出就会变成这样:
接下来,来看看作业里的这道题
#include<stdio.h>
int main()
{
int a,b;
char c;
double m=0,s;
scanf("%d %d %c",&a,&b,&c);
if(b == 90 ) m = 6.95;
if(b == 93 ) m = 7.44;
if(b == 97 ) m = 7.93;
if(c=='m'){
s = a*m*0.95;
}else{
s = a*m*0.97;
}
printf("%.2f",s);
return 0;
}
SZTU-ACM新手周赛第一场中的前三题
1.log2(n):
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d",&n);
if(n>=1&&n<=pow(10,18)){
int i,k;
for(i=0;;i++){
if(pow(2,i)<=n){
k = i;
} else{
break;
}
}
printf("%d\n",k);
}
return 0;
}
2.如何溜得更快
#include<stdio.h>
#include<math.h>
int main()
{
int r,x,y;
scanf("%d %d %d",&r,&x,&y);
if{
double d=sqrt(pow(x,2)+pow(y,2));
int i;
for(i=0;i*r<d+1;i++){
}
printf("%d",i);
}else{
printf("no");
}
return 0;
}
3.两面包夹芝士
#include<stdio.h>
int main()
{
int n=0;
scanf("%d\n",&n);
int a[n];
int b[n];
int x=0;
int t=0;
int maxa=0,maxb=0;
int i;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
if(a[i]>maxa){
maxa=a[i];
}
}
for(i=0;i<n;i++){
scanf("%d",&b[i]);
}
for(i=0;i<n;i++){
if(a[i]>maxb){
maxb=b[i];
}
}
for(x=maxa;x<=maxb;x++){
t++;
}
printf("%d",t);
return 0;
}
剩下两道题偏难,还无法独立打出来,因而不写入此博文中。