原题目链接
7-1 厘米换算英尺英寸 (15分)
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式: 输入在一行中给出1个正整数,单位是厘米。
输出格式: 在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6
#include
int main()
{
float cm,inc;
int foot,inch;
scanf("%f",&cm); //用实型读入,方便下面直接在公式中厘米转化成米。如果读取为整型,在下面公式计算中会被吞掉小数点后面的数,产生巨大误差
inc=((cm/100)/0.3048)*12; //将厘米通过公式转换成英寸
foot=inc/12;
inch=inc-foot*12; //实型数不能直接取余数,只能通过减去其整数倍来求“余数”
printf("%d %d",foot,inch);
return 0;
}
7-2 然后是几点 (15分)
有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式: 输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式: 输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310
#include
int main()
{
int hour,min,time1,time2;
scanf("%d %d",&time1,&time2);
hour=time1/100; //为了方便计算,将四位时间转换成小时分钟的形式
min=time1%100;
if(time2>=0){ //流逝时间为正数,直接加上去
if(time2<60){ //流逝时间小于一个小时,直接加到分钟位上
min=min+time2;
}
else{ //流逝时间大于一个小时,换成小时分钟的形式,分别加到小时位和分钟位上
hour=hour+time2/60;
min=min+time2%60;
}
}
else{ //流逝时间为负数,为了方便先取绝对值
time2=-time2;
if(time2<60){ //流逝时间小于一个小时,直接减到分钟位上
min=min-time2;
}
else{ //流逝时间大于一个小时,换成小时分钟的形式,分别减到小时位和分钟位上
hour=hour-time2/60;
min=min-time2%60;
}
}
if(min>=60){ //分钟位进位
min=min-60;
hour++;
}
if(min<0){ //分钟位退位
min=60+min;
hour--;
}
time1=hour*100+min; //最后将小时分钟的形式转换回四位时间的形式
printf("%d",time1);
return 0;
}
7-3 逆序的三位数 (10分)
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式: 每个测试是一个3位的正整数。
输出格式: 输出按位逆序的数。
输入样例:
123
输出样例:
321
#include
int main()
{
int n,i;
int a[3]={0};
scanf("%d",&n);
i=0;
while(n){ //求出该数的各数位的数字
a[i]=n%10;
n=n/10;
i++;
}
for(i=0;i<3;i++){ //逆序数
n=n*10+a[i];
}
printf("%d",n);
return 0;
}
7-4 BCD解密 (10分)
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式: 输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式: 输出对应的十进制数。
输入样例:
18
输出样例:
12
#include
int main()
{
int BCD;
int uni,dec; //个位,十位
scanf("%d",&BCD);
uni=BCD%16; //十六进制转十进制
dec=BCD/16;
BCD=dec*10+uni;
printf("%d",BCD);
return 0;
}
7-5 表格输出 (5分)
本题要求编写程序,按照规定格式输出表格。
输入格式: 本题目没有输入。
输出格式: 要求严格按照给出的格式输出下列表格:
#include
int main()
{
printf("------------------------------------\n");
printf("Province Area(km2) Pop.(10K)\n");
printf("------------------------------------\n");
printf("Anhui 139600.00 6461.00\n");
printf("Beijing 16410.54 1180.70\n");
printf("Chongqing 82400.00 3144.23\n");
printf("Shanghai 6340.50 1360.26\n");
printf("Zhejiang 101800.00 4894.00\n");
printf("------------------------------------\n");
return 0;
}
7-6 混合类型数据格式化输入 (5分)
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
输入格式: 输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。
输出格式: 在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。
输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70
#include
int main()
{
float f1,f2;
int I;
char C;
scanf("%f %d %c %f",&f1,&I,&C,&f2);
printf("%c %d %.2f %.2f",C,I,f1,f2);
return 0;
}
7-7 12-24小时制 (15分)
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
输入格式: 输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
提示: 在scanf的格式字符串中加入:,让scanf来处理这个冒号。
输出格式: 在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。
输入样例:
21:11
输出样例:
9:11 PM
#include
int main()
{
int hour,min;
int ret=1;
char col;
scanf("%d%c%d",&hour,&col,&min); //冒号直接以字符串形式读入
if(hour>12){ //判断上下午时间,如果下午的时间需要进行调整
hour=hour-12;
ret=0;
}
if(hour==12){ //中午12点做单独判断处理
ret=0;
}
if(ret){ //
printf("%d%c%d AM",hour,col,min);
}
else{
printf("%d%c%d PM",hour,col,min);
}
return 0;
}
7-8 超速判断 (10分)
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
输入格式: 输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。
输出格式: 在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。
输入样例1:
40
输出样例1:
Speed: 40 - OK
输入样例2:
75
输出样例2:
Speed: 75 - Speeding
#include
int main()
{
int v;
scanf("%d",&v);
if(v>60){
printf("Speed: %d - Speeding",v);
}
else{
printf("Speed: %d - OK",v);
}
return 0;
}
7-9 用天平找小球 (10分)
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式: 输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式: 在一行中输出唯一的那个不一样的球。
输入样例:
1 1 2
输出样例:
C
#include
int main()
{
int a,b,c;
int key=0;
char ch[3]={'A','B','C'};
scanf("%d %d %d",&a,&b,&c);
if(a==b){
key=2;
}
else{
if(a==c){
key=1;
}
else{
key=0;
}
}
printf("%c",ch[key]);
return 0;
}
7-10 计算工资 (15分)
某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。
输入格式: 输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。
输出格式: 在一行输出该员工的周薪,精确到小数点后2位。
输入样例1:
5 40
输出样例1:
2000.00
输入样例2:
3 50
输出样例2:
1650.00
#include
int main()
{
int year;
float hour,money=0.0; //周薪要初始化
scanf("%d %f",&year,&hour);
if(year<5){ //判断是新员工还是老员工
if(hour<40){
money=hour*30;
}
else{
money=1200+(hour-40)*30*1.5;
}
}
else{
if(hour<40){
money=hour*50;
}
else{
money=2000+(hour-40)*50*1.5;
}
}
printf("%.2f",money);
return 0;
}
7-11 分段计算居民水费 (10分)
为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。
输入格式: 输入在一行中给出非负实数x。
输出格式: 在一行输出应交的水费,精确到小数点后2位。
输入样例1:
12
输出样例1:
16.00
输入样例2:
16
输出样例2:
22.50
#include
int main()
{
float x,y=0.0;
scanf("%f",&x);
if(x>15){ //对用水量进行判断
y=2.5*x-17.5;
}
else{
y=4*x/3;
}
printf("%.2f",y);
return 0;
}
7-12 两个数的简单计算器 (10分)
本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式: 输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式: 当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
输入样例1:
-7 / 2
输出样例1:
-3
输入样例2:
3 & 6
输出样例2:
ERROR
#include
int main()
{
int x,y,z;
int ret=0;
char c;
scanf("%d %c %d",&x,&c,&y);
switch(c) //对运算符进行判断
{
case '+':z=x+y; break;
case '-':z=x-y; break;
case '*':z=x*y; break;
case '/':z=x/y; break;
case '%':z=x%y; break;
default:ret=1; break;
}
if(ret){
printf("ERROR");
}
else{
printf("%d",z);
}
return 0;
}
7-13 日K蜡烛图 (15分)
股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果Close
输入格式: 输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。
输出格式: 在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow。
输入样例1:
5.110 5.250 5.100 5.105
输出样例1:
BW-Solid with Lower Shadow and Upper Shadow
输入样例2:
5.110 5.110 5.110 5.110
输出样例2:
R-Cross
输入样例3:
5.110 5.125 5.112 5.126
输出样例3:
R-Hollow
#include
int main()
{
float Open,High,Low,Close;
scanf("%f %f %f %f",&Open,&High,&Low,&Close);
if(Open==Close){ //先判断open与close的关系
printf("R-Cross");
}
else{
if(Open<Close){
printf("R-Hollow");
}
else{
printf("BW-Solid");
}
}
//判断low、high与open、cloes的关系
if( ( (Low<Open)&&(Low<Close) ) && ( (High>Open)&&(High>Close) ) ){
printf(" with Lower Shadow and Upper Shadow");
} //最先判断高的都高、低的都低的情况
else{
if( (Low<Open)&&(Low<Close) ){ //只有low低的情况
printf(" with Lower Shadow");
}
if( (High>Open)&&(High>Close) ){ //只有high高的情况
printf(" with Upper Shadow");
}
}
return 0;
}
7-14 求整数段和 (15分)
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
#include
int main()
{
int A,B,i;
int X=0,sum=0;
scanf("%d %d",&A,&B);
for(i=A;i<=B;i++){
printf("%5d",i); //输出每一行的五个数字
sum++;
if(sum==5) { //如果正好是第五个数字,换下一行
printf("\n");
sum=0;}
X=X+i; //计算所有数字之和
}
if(sum!=0) printf("\n");
//判断最后一个输出的数字是否是该行的最后一个,如果不是要手动换行
printf("Sum = %d",X);
return 0;
}
7-15 计算圆周率 (15分) 【可改进】
根据下面关系式,求圆周率的值,直到最后一项的值小于给定阈值。
输入格式: 输入在一行中给出小于1的阈值。
输出格式: 在一行中输出满足阈值条件的近似圆周率,输出到小数点后6位。
输入样例:
0.01
输出样例:
3.132157
#include
float PI(int n);
double f=1.0;
int main()
{
float pi1,pi2,x,P;
int i;
int ret=1;
scanf("%f",&x);
pi1=1;
i=2;
do{
pi2=pi1+PI(i++);
P=pi2-pi1;
if(P<x){
ret=0;
}
else{
pi1=pi2;
}
}while(ret);
printf("%.6f",2*pi2);
return 0;
}
float PI(int n){
f=f*(n-1)/(2*n-1);
return f;
}
7-16 求符合给定条件的整数集 (15分)
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式: 输入在一行中给出A。
输出格式: 输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
#include
int main()
{
int n,i,j,k,s;
scanf("%d",&n);
for(i=n;i<n+4;i++){
s=0; //初试清零
for(j=n;j<n+4;j++){
if(j!=i){ //第一个数和第二个数不能重复
for(k=n;k<n+4;k++){
if( (k!=i)&&(k!=j) ){ //第三个数不能与第一个第二个数重复
printf("%d%d%d",i,j,k);
s++;
if(s<6) printf(" "); //判断是否需要输出空格
}
}
}
}
printf("\n"); //一层循环完要进行换行
}
return 0;
}
7-19 支票面额 (15分)
一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式: 输入在一行中给出小于100的正整数n。
输出格式: 在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
#include
int main()
{
int y=0,f=0,n;
int ret=1;
scanf("%d",&n);
for(f=1;f<100;f++){
while(y<f){
//通过题目得出的关系式,如果关系式成立则有解,输出并跳出循环
if( (98*f-199*y)==n ){
printf("%d.%d",y,f);
ret=0;
break;
}
y++;
}
y=0;
}
if(ret){
printf("No Solution");
}
return 0;
}
7-22 龟兔赛跑 (20分)
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式: 输入在一行中给出比赛时间T(分钟)。
输出格式: 在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出_,平局则输出--;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
#include
int main()
{
int time,rabbit,tortoise;
rabbit=0; //初始化兔子乌龟跑过的距离
tortoise=0;
scanf("%d",&time);
while(time>0){
if(rabbit>tortoise){ //如果兔子跑在乌龟前面停下来休息
if(time>=30){
tortoise=tortoise+3*30;
}
else{
tortoise=tortoise+3*time;
}
time=time-30;
}
else{ //如果乌龟超过兔子,兔子继续跑
if(time>=10){
rabbit=rabbit+9*10;
tortoise=tortoise+3*10;
}
else{
rabbit=rabbit+9*time;
tortoise=tortoise+3*time;
}
time=time-10;
}
}
if(rabbit==tortoise){ //兔子乌龟距离相等
printf("-_- %d",rabbit);
}
else{
if(tortoise>rabbit){ //乌龟在兔子前面
printf("@_@ %d",tortoise);
}
else{ //兔子在乌龟前面
printf("^_^ %d",rabbit);
}
}
return 0;
}
7-25 念数字 (15分)
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式: 输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式: 在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
输入样例:
-600
输出样例:
fu liu ling ling
#include
void print(char N); //数字打印函数
int main()
{
char c[10]={0};
//由于不清楚输入的数有几位,为了防止溢出,以字符形式读入,并且初始化字符数组
int i;
scanf("%s",&c);
i=0;
if(c[0]=='-'){ //判断是否为负数
printf("fu ");
i++;
}
while(c[i]!=0){ //对一个个数字进行打印
print(c[i]);
i++;
if(c[i]!=0){
printf(" ");
}
}
return 0;
}
void print(char N){
switch(N){
case '0': printf("ling"); break;
case '1': printf("yi"); break;
case '2': printf("er"); break;
case '3': printf("san"); break;
case '4': printf("si"); break;
case '5': printf("wu"); break;
case '6': printf("liu"); break;
case '7': printf("qi"); break;
case '8': printf("ba"); break;
case '9': printf("jiu"); break;
}
}