C语言基础练习题及代码.docx
《C语言基础练习题及代码.docx》由会员分享,可在线阅读,更多相关《C语言基础练习题及代码.docx(46页珍藏版)》请在冰豆网上搜索。
C语言基础练习题及代码
读前须知:
1.此文档为UP主在为期11周的c语言学习课程中做过的在线测评练习题,题目和UP主自己写的代码都在这里。
2.由于水平有限,所用的算法并不是很简洁,部分题目是暴力循环破解的。
精益求精者请自行思考或XX。
3.由于课业紧张,写的时候几乎没有写注释,排版也比较紧凑,这些可能会给读者的理解带来困难,在此先说一声抱歉。
4.由于老师教的不好,学习过程中不大愉悦,因此用了一些恶趣味的单词作为变量名泄愤,恳请不要在意这些细节…
5.由于学校以在线测评的方式考核,UP主并没有考虑各种人性化的细节例如输入范围限制,输入提示等。
如果程序是写给人用的,请务必考虑这些人性化设置。
6.本文档仅供各位网友参考学习c语言之用,读者擅自用作他途所造成的一切不良后果与UP主无关。
身高预测
【问题描述】
父母都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高因素包括遗传、饮食习惯与体育锻炼等。
小孩成人后的身高与其父母的身高和自身的性别密切相关设fatH为其父身高,motH为其母身高,身高预测公式为
男性成人时身高=(fatH+motH)*0.54cm
女性成人时身高=(fatH*0.923+motH)/2cm
此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生习惯,那么可增加身高1.5%。
请编程利用给定公式和身高预测方法对身高进行预测。
【输入】
输入由键盘输入,共5行。
第一行有一个字符sex,代表用户的性别(F或f代表女性,M或m代表男性)
第二行有一个实数fatH,代表父亲身高
第三行有一个实数motH,代表母亲身高
第四行有一个字符spor,代表是否喜爱体育锻炼(Y或y代表喜爱锻炼,N或n代表不喜爱锻炼)
第五行有一个字符diet,代表是否有良好的饮食习惯(Y或y代表饮食习惯良好,N或n代表饮食习惯不好)
【输出】
输出只有1行,为所预测的身高hei(不保留小数),输出格式为Yourfutureheightwillbehei(cm)
【样例输入】
f
176
160
y
y
【样例输出】
Yourfutureheightwillbe167(cm)
【数据范围】
对于fatH,motH,hei,保证100%的数据不超过double类型的范围
对于sex,spor,diet,保证没有非法数据
【注释】
hint1:
数据输入时请考虑\n的影响
hint2:
cms系统将所有warning均视为error
hint3:
main()函数请使用intmain(),否则会提示编译错误。
/*==================================================================*/
#include
intmain()
{
doublefatH,motH,hei,in;
charsex,spor,diet,beyond;
scanf("%c\n%lf\n%lf\n%c\n%c",&sex,&fatH,&motH,&spor,&diet);
in=1.0;
beyond='i';
if((sex=='F')||(sex=='f'))
{
hei=(fatH*0.923+motH)/2;
}
elseif((sex=='M')||(sex=='m'))
{
hei=(fatH+motH)*0.54;
}
elsebeyond='e';
if((spor=='y')||(spor=='Y'))
{
in=in+0.02;
}
elseif((spor=='n')||(spor=='N'))in=in;
elsebeyond='e';
if((diet=='y')||(diet=='Y'))
{
in=in+0.015;
}
elseif((diet=='n')||(diet=='N'))in=in;
elsebeyond='e';
hei=hei*in;
if(beyond!
='e')
printf("Yourfutureheightwillbe%.0lf(cm)",hei);
elseprintf("thedatayouinputiswrong,pleasecheckitoutandinputagain.");
return0;
}
/*==================================================================*/
猜数游戏1
【问题描述】
编程由计算机生成一个1~100之间的整数请用户猜,若猜对则结束游戏,并输出用户猜测次数(输出格式:
“Right,[猜测次数]time(s)”);若猜错则给出提示——若用户所猜数偏大,则输出“Big”,否则输出“Small”。
一次游戏最多可以猜10次,若经过10次仍未猜中的话,输出“over”,并结束游戏。
【样例过程1】
>50
Big
>25
Small
>30
Small
>40
Small
>45
Big
>42
Big
>41
Right,7time(s)
【样例过程2】
>1
Small
>2
Small
>3
Small
>4
Small
>5
Small
>6
Small
>7
Small
>8
Small
>9
Small
>10
Small
over
【注释】
hint1:
“>”行代表为用户输入
hint2:
请使用“dowhile”循环实现
hint3:
该题为离线评测,程序提交过后不会立即得到成绩,请耐心等待批改
/*=================================================================*/
#include
#include
intmain()
{
intguess,ra,times;
ra=rand()%100;
times=1;
printf("pleaseguessanumberin0~100\n");
do
{
scanf("%d",&guess);
if(guess==ra)
{
printf("Right,%dtime(s)",times);
times=12;
break;
}
elseif(guesselseprintf("Big\n");
times++;
}while(times<=10);
if(times!
=12)printf("over");
return0;
}
/*==================================================================*/
猜数游戏2
【问题描述】
编程由计算机生成一个1~100之间的整数请用户猜,若猜对则输出用户猜测次数(输出格式:
“Right,[猜测次数]time(s)”);若猜错则给出提示——若用户所猜数偏大,则输出“Big”,否则输出“Small”。
一次游戏最多可以猜10次,若经过10次仍未猜中的话,输出“over”;一轮游戏结束之后,询问用户是否进行下一轮游戏(输出格式:
“continue?
Y||N”),并等待用户响应(若“Y”、“N”输入非法,则重复询问)。
另外,要求程序能够判断非法数据,若用户输入非法,输出“illegalinput”,然后让用户重新输入。
【样例过程1】
>50
Small
>75
Small
>80
Small
>90
Small
>95
Small
>98
Right,6time(s)
continue?
Y||N
>Y
>50
Small
>75
Big
>60
Big
>55
Small
>57
Small
>58
Small
>59
Right,7time(s)
continue?
Y||N
>N
【样例过程2】
>a
illegalinput
>1
Small
>2
Small
>3
Small
>4
Small
>5
Small
>6
Small
>7
Small
>8
Small
>9
Small
>10
Small
over
continue?
Y||N
>a
continue?
Y||N
>N
【注释】
hint1:
“>”行代表为用户输入
hint2:
该题为离线评测,程序提交过后不会立即得到成绩,请耐心等待批改
/*===================================================================*/
#include
#include
intmain()
{
intguess,ra,times,mark;
charc,d;
c='y';
while((c=='y')||(c=='Y'))
{
ra=rand()%100;
times=1;
for(mark=1;mark<=10;mark++)
{
if(scanf("%d",&guess)!
=0)
{
if(guess==ra)
{
printf("Right,%dtime(s)",times);
mark=15;
break;
}
elseif((guess>=0)&&(guess{
printf("Small\n");
getchar();
times++;
}
elseif((guess<=100)&&(guess>ra))
{
printf("Big\n");
getchar();
times++;
}
else
{
printf("illegalinput\n");
getchar();
mark=times-1;
}
}
else
{
printf("illegalinput\n");
getchar();
mark=times-1;
}
}
if(mark!
=15)printf("over\n");
do
{
printf("continue?
Y||N\n");
scanf("%c",&c);
if((c=='n')||(c=='N')||(c=='y')||(c=='Y'))
d='a';
else
{
printf("illegalinput\n");
d='i';
}
}
while(d=='i');
}
return0;
}
/*==================================================================*/
无重复数字的三位数
【问题描述】
有0、1、2...9十个数字,编程计算这10个数字能组成多少个互不相同且无重复数字的三位数(如:
123,124,125...),并列举所组成的三位数。
【输出】
输出共两行:
第一行为符合条件的三位数个数
第二行从小到大依次输出这些满足条件的三位数,相邻两个数之间用1个空格隔开。
【注释】
hint1:
关注所输出的最后一个满足条件的三位数
/*================================================================*/
#include
intmain()
{
inti,j,k,n,s;
printf("%d\n",10*9*8-9*8);
n=0;
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
{
if(i!
=j)
for(k=0;k<=9;k++)
{
if(i!
=k&&j!
=k&&n==647)
{
s=100*i+10*j+k;
printf("%d",s);
n++;
}
elseif(i!
=k&&j!
=k&&n!
=647)
{
s=100*i+10*j+k;
printf("%d",s);
n++;
}
}
}
}
/*printf("xx\n%d",n);*/
return0;
}
/*==================================================================*/
求最大公约数,从大到小试探法
【问题描述】
编程用试探法(要求从大到小试探)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。
【输入】
输入由键盘输入,只有1行
这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]”
【输出】
输出共1行,为m和n的最大公约数,输出格式为“Theresultis[所求最大公约数]!
”
【样例输入】
2,1
【样例输出】
Theresultis1!
【数据范围】
保证100%的数据在int范围内
【注释】
hint1:
请严格按照题目要求完成任务
/*=============================================================*/
#include
intgcd(intm,intn)
{
inti,s,f;
f=m;
if(ffor(i=f;i>=1;i--)if(m%i==0&&n%i==0){s=i;break;}
returns;
}
intmain()
{
intmm,nn,lzsb;
scanf("%d,%d",&mm,&nn);
lzsb=gcd(mm,nn);
printf("Theresultis%d!
",lzsb);
}
/*==============================================================*/
求最大公约数,辗转相除法
【问题描述】
编程用辗转相除法(不使用递归)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。
【输入】
输入由键盘输入,只有1行
这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]”
【输出】
输出共1行,为m和n的最大公约数,输出格式为“Theresultis[所求最大公约数]!
”
【样例输入】
2,1
【样例输出】
Theresultis1!
【数据范围】
保证100%的数据在int范围内
【注释】
hint1:
请严格按照题目要求完成任务
/*==================================================================*/
#include
intgcd(intm,intn)
{
intillness,kill,death,shit;
illness=m;
if(illnesselsekill=n;
do
{
shit=kill%illness;
kill=illness;
illness=shit;
}while(shit!
=0);
returnkill;
}
intmain()
{
intmm,nn,doubi;
scanf("%d,%d",&mm,&nn);
doubi=gcd(mm,nn);
printf("Theresultis%d!
",doubi);
}
/*=============================================================*/
求最大公约数,递归
【问题描述】
编程用辗转相除法(使用递归调用)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。
【输入】
输入由键盘输入,只有1行
这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]”
【输出】
输出共1行,为m和n的最大公约数,输出格式为“Theresultis[所求最大公约数]!
”
【样例输入】
2,1
【样例输出】
Theresultis1!
【数据范围】
保证100%的数据在int范围内
【注释】
hint1:
请严格按照题目要求完成任务
/*==================================================================*/
#include
intgcd(intm,intn)
{
intdawa,erwa,shit;
dawa=m;
if(dawaelseerwa=n;
shit=dawa%erwa;
if(shit!
=0)erwa=gcd(erwa,shit);
returnerwa;
}
intmain()
{
intdou,bi,doubi;
scanf("%d,%d",&dou,&bi);
doubi=gcd(dou,bi);
printf("Theresultis%d!
",doubi);
return0;
}
/*==================================================================*/
猴子分桃
[UP主吐槽:
这些天生神力的猴子能一次搬上亿只桃子,请考虑数据超限的问题,题目所说的数据范围不够用。
]
【问题描述】有1堆桃子共m个,由n只猴子分配这些桃子。
每次到达桃子堆放地的猴子只有1只,而且每个猴子都会平均分1次桃子。
第1只到达的猴子将桃子平均分成n等份,但发现多k(k第2只猴子同样将剩余的桃子又分成n等份,也发现多k个,并同样将多余的k个扔掉,然后拿走其中1份。
之后的每只猴子都这样(将剩余的桃子又分成n等份,也发现多k个,并将多余的k个扔掉,然后拿走其中1份)。
现在假设最后一只猴子分配后至少可以拿走1个桃子,请根据输入的n和k值,编程计算最小的m。
(比如,n=3,k=1,则最小的m是25,最后一只猴子分得3个)
【输入】输入由键盘输入,共1行这一行由两个整数n和k组成,分别代表n只猴子和多余的k个桃子
【输出】输出只有一行,为所计算的m
【样例输入】
31
【样例输出】
25
【数据范围】保证100%数据不超过int范围
/*================================================================*/
#include
intmain()
{
longm,n,k,i,st,ma,ml;
scanf("%ld%ld",&n,&k);
ma=2147483647;
for(st=1;st<=1000000;st++)
{
m=st*n+k;
ml=0;
for(i=2;i<=n;i++)
{
ml=m%(n-1);
if(ml==0)
m=m*n/(n-1)+k;
else{
m=2147483647;
break;
}
}
/*printf("%d\n",m);*/
if(m}
printf("%d",ma);
return0;
}
/*=============================================================*/
约瑟夫问题
【问题描述】
n个人围成一圈,顺序编号。
从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。
【输入】
输入由键盘输入,只有一行
这一行有一个正整数n,代表n个人围成一圈
【输出】
输出共一行,为最后留下来的那个人的编号
【样例输入】
5
【样例输出】
4
【数据范围】
保证100%数据2<=n<=200
/*==============================================================*/
#include
intmain()
{
intidiot[201];
inti,san,left,db;
scanf("%d",&db);
for(i=0;ii=-1;
left=db;
san=0;
while(left!
=1)
{
i++;
if(i==db)i=0;
if(idiot[i]==0)
{
san++;
if(san==3)
{
san=0;
idiot[i]=1;
left--;
}
}
}
for(i=0;iif(idiot[i]==0)printf("%d",i+1);
return0;
}
/*=================================================================*/
约瑟夫问题,链表法
【问题描述】
n个人围成一圈,顺序编号。
从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。
(要求用链表法)
【输入】
输入由键盘输入,只有一行
这一行有一个正整数n,代表n个人围成一圈
【输出】
输出共一行,为最后留下来的那个人的编号
【样例输入】
5
【样例输出】
4
【数据范围】
保证100%数据2<=n<=200
/*=================================================================*/
#include
#include
inthollyshit=0;
structfucklb
{
intdata;
structfucklb*nxx;
};
structfucklb*App(structfucklb*head)
{
structfucklb*ppp=NULL,*ppr=hea