沧海竞舟热身赛I-题解
沧海竞舟热身赛一共10题,这是本人第一次尝试写题解,写得不好的地方,还请大家指正!谢谢!
1.有理数加法
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
第一题水题,不过对于C语言基础不太好的朋友来说,有些需要注意的地方,想一想怎么约分,怎么进行分数的相加,然后注意输出格式就可以了。
#include<stdio.h>
int gcd(int a,int b){
//约分函数
if(a%b==0)
return b;
return gcd(b,a%b);
}
int main(){
int a1,b1,a2,b2,a3,b3,p,q;
scanf("%d/%d %d/%d",&a1,&b1,&a2,&b2);
b3=b1*b2;
a3=a1*b2+a2*b1;
p=a3;
q=b3;
a3/=gcd(p,q);
b3/=gcd(p,q);
if(b3==1) //注意输出格式
printf("%d",a3);
else
printf("%d/%d",a3,b3);
}
2.鸡兔同笼问题
输入两个整数代表鸡和兔的总只数与总脚数,编写程序,输出鸡和兔各多少只(输入和输出时,按先鸡后免的顺序,中间以空格分隔)。
输入格式:
两个不超过100000的非负整数,以空格分隔。
输出格式:
两个整数,以空格分隔,若输入数据无解,输出:-1 -1(表示无可能)。
输入样例1:
10 28
输出样例1:
6 4
输入样例2:
18 35
输出样例2:
-1 -1
差不多也算水题,只需要注意输入的合法性,就可以转换为经典的数学问题。
#include<stdio.h>
int main(){
int a,b,c,d;
scanf("%d %d",&a,&b);
if(b%2!=0){
//总腿数不能是奇数
printf("-1 -1");
return 0;
}
d=(b-2*a)/2;
c=a-d;
if(c<0||d<0){
//总头数不能是负数
printf("-1 -1");
return 0;
}
else{
printf("%d %d",c,d);
}
}
3.数字菱形
输入一个0-9的数字和一个菱形的高度,编程输出这个菱形。
输入格式:
输入一个0-9的数字和一个菱形的高度(假定输入的高度为[3,33]内的奇数),两个整数间有空格分隔。
输出格式:
输出由指定数字开始绘制的指定高度的菱形。注意,编制菱形的数字是依次循环出现的,且整个菱形剧左显示(最宽的那一行,左边无空格)。
输入样例:
7 11
输出样例:
7
8 8
9 9
0 0
1 1
2 2
1 1
0 0
9 9
8 8
7
这题的题意非常易懂,不过调整输出格式就稍微有点麻烦了。看输出样例,我建议把菱形分成五部分输出:第1行,第2-5行,第6行,第7-10行,第11行。第一行,最后一行和最中间的一行特殊处理。容易发现,每行两个数之间的空格数(从第2行到第10行)为1,3,5,7,9,7,5,3,1.故用一个变量q可控制,在菱形上半部分,每行输出后让q+=2,在菱形下半部分,每行输出后让q-=2。最后还需要对菱形中的数字进行相应处理。
#include<stdio.h>
int main(){
int n,k,p,q,flag=1;
scanf("%d %d",&n,&k);
p=k/2; //想想为什么这么处理
q=1;
for(int i=1;i<=p;i++){
if(flag)
flag=0;
else
printf("\n");
if(i==1){
//首行特殊处理
for(int j=1;j<=p;j++)
printf(" ");
printf("%d",n);
}
else{
for(int j=1;j<=p-i+1;j++)
printf(" ");
printf("%d",n);
for(int j=1;j<=q;j++)
printf(" ");
printf("%d",n);
q+=2;
}
n++;
n=n%10; //保证n是个位数
}
printf("\n%d",n);
for(int i=1;i<=q;i++)
printf(" ");
printf("%d",n)