目录
第一题:小球自由落体
描述
一个小球从100m高度自由落下,每次落地后返跳回到原来高度的一半,再落下,再返弹。求它第n次落地时,共经过多少米以及第n次返弹多高。
输入
一个正整数n
输出
输出一行。
输出两个实数,用空格隔开,结果精确到小数点后两位。
输入样例1
1
输出样例1
100.00 50.00
题解
题目描述提出每次反弹都是原来高度的一半,高度固定100,那么首先反弹之前的那个瞬间小球需要先下落所以至少有100,然后叹气为之前的一半,所以第一次下落应该为50,同时后面每次下落之前需要经历的是先弹起在下落,所以需要下落高度*2,然后即可求解
代码
//C语言
#include <stdio.h>
int n;
int main()
{
scanf("%d",&n);
double sum=100.00;//小球走过的路程
double ract=50.00;//反弹的高度
for(int i=1;i<n;i++)
{
sum+=ract*2;
ract/=2;
}
printf("%.2lf %.2lf\n",sum,ract);
return 0;
}
第二题:超级玛丽游戏
描述
超级玛丽游戏
输入
********
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
输出
等同于输入
输入样例1
无
输出样例1
无
题解
简单的直接输出,直接复制然后每一行补一个输出即可
代码
//C++代码
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << " ********" << endl;
cout << " ************" << endl;
cout << " ####....#." << endl;
cout << " #..###.....##...." << endl;
cout << " ###.......###### ### ###"<< endl;
cout << " ........... #...# #...#" << endl;
cout << " ##*####### #.#.# #.#.#" << endl;
cout << " ####*******###### #.#.# #.#.#" << endl;
cout << " ...#***.****.*###.... #...# #...#" << endl;
cout << " ....**********##..... ### ###" << endl;
cout << " ....**** *****...." << endl;
cout << " #### ####" << endl;
cout << " ###### ######" << endl;
cout << "##############################################################" << endl;
cout << "#...#......#.##...#......#.##...#......#.##------------------#" << endl;
cout << "###########################################------------------#" << endl;
cout << "#..#....#....##..#....#....##..#....#....#####################" << endl;
cout << "########################################## #----------#" << endl;
cout << "#.....#......##.....#......##.....#......# #----------#" << endl;
cout << "########################################## #----------#" << endl;
cout << "#.#..#....#..##.#..#....#..##.#..#....#..# #----------#" << endl;
cout << "########################################## ############" << endl;
return 0;
}
第三题:算法提高 解二元一次方程组
描述
给定一个二元一次方程组,形如:
a * x + b * y = c;
d * x + e * y = f;
x,y代表未知数,a, b, c, d, e, f为参数。
求解x,y
输入
输入描述:
输入包含六个整数: a, b, c, d, e, f;
输入样例:
例:
3 7 41 2 1 9
输出
输出描述:
输出为方程组的解,两个整数x, y。
输出样例:
例:
2 5
输入样例1
3 7 41 2 1 9
输出样例1
2 5
TIPS
HINT:时间限制:1.0s 内存限制:256.0MB
0 <= a, b, c, d, e, f <= 2147483647
题解
这是一个数学问题,首先消掉一个变量X,或者Y,我选择先消掉X
方程:
将第一个式子整体乘得到
然后再第一个减去第二个得到
化简得到
然后将y带回即可得到x
代码
//C语言
#include <stdio.h>
int n;
int main()
{
int a,b,c,d,e,f;
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
int up=c*d-a*f;
int down=b*d-a*e;
int y=up/down;
int x=(c-b*y)/a;
printf("%d %d\n",x,y);
return 0;
}
第四题:水仙花数
描述
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
输入
两个整数m和n(100<=m<=n<=999)。
输出
要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
输入样例1
300 380
输出样例1
370 371
题解
水仙花数如题目所说每一位的立方相加如果等于他自己即为水仙花数。那么就需要先取出每一位。首先我们定义的数据是整数,根据C语言除法直接取整的机制我们可以通过除以10来去掉最后一位,至于取出位数就需要使用取余的运算符(%),取余的即为取出原始数据除一个数的余数
示例:
51/2=15而不是等于25.5
51%2=1因为51=2*25+1;
然后只需要每次对数取余10得到最后一位,然后再数以10消去最后一位即可得到每一位知道数为0,然后途中计算一个立方即可。
如:
153
第一次153%10=3得到3 153/10=15
第二次15%10=5得到5 15/10=1
第三次1%10=1得到1 1/10=0
停止计算
代码
//C语言
#include <stdio.h>
int n,m;
int func(int a)//判断是否为水仙花数,返回1即为是否则不是
{
int x=a;
int num=0;
while(x)
{
int tmp=x%10;//取出每一位数字
num+=(tmp*tmp*tmp);//累计每一位数字立方
x=x/10;
}
if(a==num)
return 1;
else
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
int ans=0;//计数水仙花数的个数
for(int i=n; i<=m; i++)
{
if(func(i))
{
ans=ans+1;
printf("%d ",i);
}
}
if(ans)//如果个数为0证明没有则输出no
printf("\n");
else
printf("no\n");
return 0;
}
第五题:C语言-猴子吃桃
描述
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
输入
N
输出
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
输入样例1
10
输出样例1
1534
题解
题目标书表示猴子每次吃的是一半多一个,然后答案需要反向操作
即:
现在已知y求x,所以
然后根据这个公式循环计算即可
代码
//C语言
#include <stdio.h>
int main()
{
int n;
int sum=1;
scanf("%d",&n);
for(int i=1;i<n;i++)
{
sum=(sum+1)*2;
}
printf("%d\n",sum);
return 0;
}
第六题:镂空三角形
描述
把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效果。在设计的过程中,需要给出各种花纹的材料和大小尺寸的三角形样板,通过电脑临时做出来,以便看看效果。
输入
每行包含一个字符和一个整数n(0<n<41),不同的字符表示不同的花纹,整数n表示等腰三角形的高。显然其底边长为2n-1。如果遇到@字符,则表示所做出来的样板三角形已经够了。
输出
每个样板三角形之间应空上一行,三角形的中间为空。显然行末没有多余的空格。
输入样例1
X 2
A 7
@
输出样例1
X
XXX
A
A A
A A
A A
A A
A A
AAAAAAAAAAAAA
解析
这题提前声明了要求多组输入
多组输入的意思是可以一直输入直到达到了题目的输入停止为止
多组输入的C语言格式
若无要求怎么多组输入则为:while(~scanf()) ~表示知道文件结束
如有可以选择在循环体内书写主要格式为while()接入一个输入语句
题目说明为等腰三角形所以肯定是轴对称,而底面长为2*n-1所以中轴线为n的位置那么,上面的都是根据对称得来的,而从上到下两个字母与中轴线的距离为0~n-1然后即可得到结果。
注意每个三角形之后还有一个换行需要注意写好
代码
//C语言
#include <stdio.h>
int main()
{
char a;
int n;
while(scanf("%c",&a))
{
if(a=='@')
break;
scanf("%d",&n);
getchar();
for(int i=0; i<n; i++)
{
if(i==n-1)
{
for(int j=0; j<n*2-1; j++)
printf("%c",a);
}
else
{
for(int j=1; j<=n+i; j++)
{
if(j==n-i||j==n+i)
printf("%c",a);
else
printf(" ");
}
}
printf("\n");
}
printf("\n");
}
return 0;
}
第七题:习题2-4-7 求最大公约数
描述
习题2-4-7 求最大公约数
输入
两个空格隔开的正整数m和n。
输出
m和n的最大公约数。注意行尾输出换行。
输入样例1
35 14
输出样例2
7
来源
C语言第四版教学实验-第二章 算法
题解
求最大公因数可以可以使用辗转相除法
即一个大的数和一个小的数(不大于前一个)求最大公因数使得每次都让大的数对小的数取余当可以正处即取余为0则代表后一个数为而这的最大公因数。
篇幅有限证明这里就不证明了下次一定。
大概流程为
35 14
先35%14=7 得到7
保留14和7即大的数为14小的数为7
即14%7=0
所以最大公因数为7
代码
#include <stdio.h>
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if(n<m)
{
int tmp=n;
n=m;
m=tmp;
}
while(1)
{
if(n%m==0)
{
printf("%d\n",m);
break;
}
int tmp=m;
m=n%m;
n=tmp;
}
return 0;
}
第八题:车神羲和
描述
在大荒当中,有座天台山,海水从南边流进这座山中。在东海之外,甘水之间,有个羲和国。这里有个叫羲和的女子,是帝俊的妻子,会在甘渊中给太阳洗澡。羲和生了十个太阳,后来被后羿射掉了九个!
剩下的这个太阳,羲和十分喜爱,每天驾车带着这个太阳在羲和车道上到处逛,便产生了日升日落,白天黑夜。
一日,太阳提出要自己驾车,并与羲和比试一番。
羲和虽然非常疼爱太阳,但也很想见证一下太阳的成长,便欣然接受了太阳的挑战。挑战要求和经过如下:
1、两人必须在羲和车道上进行比赛;
2、羲和车道为环形,两人在车道上的车速可以不同,但每人必须保持恒速驾驶;
3、两人从起点以相反的方向同时发车,经过A分钟两车在路上相遇擦肩而过;
4、又经过B分钟,有1人已经回到了终点(也是起点)。此时,另一人与终点的距离为C;
5、先到达终点的人获胜。
挑战结束,先到达终点的人扬长而去,真正的车神从不人前显现。太阳赶到终点,望着正在下山远去的车神羲和的车影,顿时明白了车神的真正含义。为了不留遗憾,太阳决心计算出羲和车道的长度,你能帮他实现这个心愿吗?
输入
输入有多组(不超过100)测试实例。
每组测试实例占一行,为3个正整数A(1 ≤ A ≤ 200)、B(1 ≤ B ≤ 200)、C(1 ≤ C ≤ 200),含义如题中所示。
输入结束将由一行A、B和C均等于0的测试实例表示,不应处理此测试实例。
说明:测试实例保证输入数据合法,且输出数据一定为正整数。
输出
每组测试实例输出一行,为一个正整数,即羲和车道的长度。
输入样例1
120 90 30
100 50 50
0 0 0
输出样例1
120 100
来源
第五届全国中医药院校大学生程序设计竞赛
题解
根据题目要求可以提取出三条信息
1.更快的那个人用A+B的时间到达了终点
2.更慢的那个人走完总里程的里程为(A+B)*速度+C
3.再A时间处两人回合即A*(速度1+速度2)=里程
可以得到三个方程(X为更快的人的速度,Y为更慢的人的速度,L为长度)
1 A*(X+Y)=L
2 X*(A+B)=L
3 (A+B)*Y+C=L
根据1得到4式
2,3相加得到5式
然后相减再化简即可得到
由于不知道A与B的大小关系所以需要取绝对值
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int A,B,C;
while(~scanf("%d%d%d",&A,&B,&C))
{
if(A==0&&B==C&&A==B)
break;
int way=(A*C)/(abs(A-B));//abs为取绝对值
printf("%d\n",way);
}
return 0;
}
第九题:A+B 输入输出练习II
描述
你的任务是计算a+b。
输入
第一行是一个整数N,表示后面会有N行a和b,通过空格隔开。
输出
对于输入的每对a和b,你需要在相应的行输出a、b的和。
如第二对a和b,对应的和也输出在第二行。
输入样例1
2
1 5
10 20
输出样例1
6 30
题解
这题就是输入N个a和b然后输出a+b即可
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
第十题:迟来的A+B
描述
“A+B”多么熟悉的题目,在本届校赛开始前CHZ同学(人称“dp小王子“)一直叫我出道A+B给他做,但由于各种原因没有出成,使他感到很遗憾,为了在世界末日前弥补他的遗憾,就决定出道A+B献给CHZ同学!!题目是这样的:
先给你n(1=<n<=100000)个数的数组A,再给你两个数X,Y(1=<X,Y<n),求sum=(A0+A1+….+Ax-1)+(Ay+Ay+1+….+An-1);
输入
有多组数据,每组数据的第一行有两个数字n,m(1=<m<=50000),表示数据的个数和查询的个数,第二行是n个数据,第三行到m+3行每行有两个数X,Y(1=<X,Y<n);
输出
对每个查询输出一个结果,每个结果占一行
输入样例1
10 1
1 2 3 4 5 5 4 3 2 1
5 5
输出样例1
30
题解
题目意思是给你一组数据然后求前X个数和后Y个数的和即可
可以使用数组存储前几个数的和以及后几个数的和
然后相加输出即可
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[100001];
int sum_x[100001];
int sum_y[100001];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum_x[i]=a[i];//考虑前面的数值
if(i>0)//数组下标必须大于0
sum_x[i]+=sum_x[i-1];
}
for(i=n-1;i>=0;i--)
{
sum_y[i]=a[i];
if(i<n-1)//数组下表必须小于n
sum_y[i]+=sum_y[i+1];
}
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>0)//数组下标必须大于0
printf("%d\n",sum_x[a-1]+sum_y[b]);
else
printf("%d\n",sum_x[a]+sum_y[b]);
}
}
return 0;
}