C基础的练习集及测试答案(16-30)
16、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)
#if 0
、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,
则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)
解题思路:
一。各个数据的包含关系:
能被4整除 包含 能被100整除 包含 能被400整除
二。多分支判断,从最小集合开始判断则判断条件最为简单;
#endif
#include<stdio.h> int main(){
int year;
scanf("%d",&year); if((year%)==){
printf("%d是闰年",year);
}else if((year%)==){
printf("%d不是闰年",year);
}else if((year%)==){
printf("%d是闰年",year);
}else{
printf("%d不是闰年",year);
}
return ;
}
17、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。90~100为优,80~89为良,70~79为中,60~69为及格,0~59为不及格,其他则输出错误信息。要求使用switch实现。
#if 0
、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。~100为优,~89为良,~79为中,~69为及格,
~59为不及格,其他则输出错误信息。要求使用switch实现。 解题思路:
一。判断数据是否合法;
二。提取分数的十位进行switch判断。 #endif
#include<stdio.h>
int main(){
int grade;
scanf("%d",&grade);
if((grade>)||(grade<)){
printf("%d数据不合法",grade);
}
grade/=;
switch(grade){
case :
case :
printf("%d等级为:优",grade);
break;
case :
printf("%d等级为:良",grade);
break;
case :
printf("%d等级为:中",grade);
break;
case :
printf("%d等级为:及格",grade);
break;
default:
printf("%d等级为:不及格",grade); }
printf("%lf",(grade*0.4)); return ;
}
18、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
freight = weight * distance * price * (1-discount);
路程与折扣的关系如下:
s<250:无折扣
250<=s<500:2%折扣
500<=s<1000:5%折扣
1000<=s<2000:8%折扣
2000<=s<3000:10%折扣
3000<=s:15%折扣
要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。
#if 0
、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
freight = distance * distance * price * (-discount);
路程与折扣的关系如下:
s<:无折扣
<=s<:%折扣
<=s<:%折扣
<=s<:%折扣
<=s<:%折扣
<=s:%折扣
要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。
解题思路:
一。将重量进行分段,对每段重量的费用进行计算。
二。从大重量向小重量遍历计算比小重量向大重量计算各直观
例如
大到小:向算先算一千到一百,自减九百,再算一百到零,
小到大:先算零到一百,自减一百,再算零至900;
三。依次从大到小判断重量的大小,计算对应重量的费用,然后重量相应自减已计算重量。
#endif #include<stdio.h>
int fun(int distance,int price,int weight){
int freight=;
if(distance>=){
freight+=(distance-)*price*8.5*weight;
printf("\n%d=(%d-3000)*%d*0.9*%d\n",freight,distance,price,weight);
distance=; }
if(distance>=){
freight+=(distance-)*price*0.90*weight;
printf("\n%d=(%d-2000)*%d*0.9*%d\n",freight,distance,price,weight);
distance=; }
if(distance>=){
freight+=(distance-)*price*0.92*weight;
printf("\n%d=(%d-3000)*%d*0.9*%d\n",freight,distance,price,weight);
distance=; }
if(distance>=){
freight+=(distance-)*price*0.95*weight;
printf("\n%d=(%d-3000)*%d*0.9*%d\n",freight,distance,price,weight);
distance=;
}
if(distance>=){
freight+=(distance-)*price*0.95*weight;
printf("\n%d=(%d-250)*%d*0.9*%d\n",freight,distance,price,weight);
distance=; }
if(distance>=){
freight+=(distance)*price*weight;
printf("\n%d=(%d-3000)*%d*%d\n",freight,distance,price,weight);
}
if(distance<){
printf("\n%d路程不能为负",distance);
} return freight;
} int main(){
int distance,price, weight;
int freight;
printf("输入 ;重量 单价 路程: ");
scanf("%d %d %d",&weight,&price,&distance);
//printf("%d %d %d",distance,unit,distance);
freight=fun(distance,price,weight);
printf("\n总价为:%d\n",freight); return ;
}
19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。
//19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。
//解题思路:for()和while互为语法糖,当循环超过一次是while()、do-while()等价;
#include<stdio.h> int fun_while(int num){
int sum=;
int i=;
while(i<=num){
sum+=i;
i++;
} return sum;
}
int fun_dowhile(int num){
int sum=;
int i=;
do{
sum+=i;
i++;
}while(i<=num);
return sum;
} int fun_for(int num){
int sum=;
int i=;
for(i=;i<=num;i++){
sum+=i; }
return sum;
} int main(){
int sum1,sum2,sum3;
sum1=fun_while();
sum2=fun_dowhile();
sum3=fun_for();
printf("while=%d ,dowhile=%d ,for=%d",sum1,sum2,sum3);
return ;
}
20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。
#if 0
20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。
解题思路:
一。遍历100至999;每次分别提取个十百位上的数;
二。判断对每次提取的数进行立方和,对比和本身是否相等从而确定水仙花数。
#endif
#include<stdio.h>
void shuixian(){
int i=;
while(i<=){ int ge=i%;
int bai=i/;
int shi=(i/)%;
//printf("%d %d %d ",bai,shi,ge);
int sum=(ge*ge*ge)+(shi*shi*shi)+(bai*bai*bai);
//printf("\n%d\n",sum);
if(sum==i){
printf("\n%d\n",sum);
}
i++;
} } int main(){
shuixian();
return ;
}
21、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1 + Fn-2 (n>=3)
#if 0
、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
F1= (n=)
F2= (n=)
Fn=Fn- + Fn- (n>=)
解题思路:
一。应该建立一个数组来存储产生的斐波那契数列,但没有对数列的操作,所以不存储直接输出
二。使用两个标志位存储n-1 和n-2 的值,由此产生n的值。
#endif #include<stdio.h> void fei(int len){
int one=;
int two=;
int i;
printf("%d\n %d \n",one,two);
for(i=;i<=len;i++){
int temp=two;
two+=one;
one=temp;
printf("%d\n",two);
}
}
int main(){
int n;
printf("打印多少项");
scanf("%d",&n); fei(n); return ;
}
22、(课堂)输出如下图形:
*
***
*****
*******
*********
……
其中需要输出几行由键盘输入。
#if 0
、(课堂)输出如下图形:
*
***
*****
*******
*********
……
其中需要输出几行由键盘输入。
解题思路:
一。确定输出多少行;
二。第i行的空格数:总行数-i
第i行的*数:i*2-1
#endif
#include<stdio.h> void sanjiao(int len){
//第I次输出几个* i*2-1
//第i次空几个 i-1 int kong,xiang,i;
for(i=;i<=len;i++){
//printf("%d",i);
//printf("%d",i); for(kong=len-i;kong>=;kong--){
printf(" ");
}
for(xiang=(i*-);xiang>=;xiang--){
printf("*"); }
printf("\n");
} } int main(){
int hang;
printf("输出几行三角");
scanf("%d",&hang);
sanjiao(hang); return ;
}
23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。列举出所有的购买方案,以及列举出所有花光100元的购买方案
#if 0
23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。
列举出所有的购买方案,以及列举出所有花光100元的购买方案
解题思路:
一。排除各买一件则剩余70元。
二。建立一个三重循环,分别代表笔记本,尺子,笔。可以遍历所有情况。总价恰好为70则为结果。
错误分析:
大O算法为n^3 ,算法效率太低。有待改进。
#endif
#include<stdio.h> void wenju(int money){
money-=(++);//30 70
int notebook,rule,pen;
for(notebook=;notebook<=;notebook++){
for(rule=;rule<=;rule++){
for(pen=;pen<=;pen++){
if(notebook*+rule*+pen*==){
printf("notebook=%d*20 ,rule=%d*6,pen=%d*4=70 \n",notebook,rule,pen);
}
}
}
}
} int main(){
//组合正好一百元;
wenju();
}
24、(课堂)输出100~200间的所有素数
#if 0
24、(课堂)输出100~200间的所有素数
解题思路:
一。遍历100~200,每个数取余 2至n/2,判断如果所有余数都不为零则该数为素数。
#endif
#include<stdio.h> void su(int low,int high){
int i;
for(i=low;i<=high;i++){
int j;
int st=;
for(j=;j<low;j++){
if(i%j==){
st++;
} }
if(st==){
printf("%d 是素数\n",i);
} } }
int main(){ su(,);
return ;
}
25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。
#if 0
25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。
解题思路:
一。建立一个五个元素数组,中间三个用于用户输入,首尾元素分别为0 101。
二。依次遍历数组两两之间,元素值之间不包括本身进行累加,
三。将最后累加值总和进行输出为结果。
#endif
#include<stdio.h> int Accumulate(int low,int high){
int sum=;
if((low+)>=(high)){
return ;
}
for(++low;low<high;low++){
sum+=low;
}
return sum;
} int main(){
int a[]={,,,,};
int i;
int sum=;
printf("请输入三个数");
scanf("%d %d %d",&a[],&a[],&a[]);
for(i=;i<;i++){
sum+=Accumulate(a[i-],a[i]);
//sum+=Accumulate(0,101);
}
//sum=Accumulate(0,101);
printf("\n结果是:%d\n",sum); return ;
}
26、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;计算输入的数中的偶数的个数、总和、平均值。
#if 0
、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;
计算输入的数中的偶数的个数、总和、平均值。 解题思路:
。通过命令行传参获取数据,但数据是字符串形式
。将字符串形式数据转换为int形式数据,放在一个数组中,便于操作
。按要求对数据进行操作 #endif #include<stdio.h>
#include<stdlib.h> int my_even(int num[],int len){
int even=;
int i=;
for(i=;i<len;i++){
if(num[i]%==){
++even;
} } return even;
}
int my_sum(int num[],int len){
int sum=;
int i=;
for(i=;i<len;i++){
sum+=num[i];
}
return sum;
} int my_ave(int num[],int len){
int ave=my_sum(num,len);
ave/=len;
return ave; } int main(int argc,char *argv[]){
int i=;
for(i=;i<argc;i++){
//printf("%s\n",argv[i]);
if(*argv[i]==''){
//i;
break;
}
}
//printf("%s",argv[i]);
int *num;
int len=i-;
if(NULL==(num=(int *)malloc(sizeof(int)*len))){
perror("cannot malloc");
return ;
}
//num[0]=NULL; for(i=;i<len;i++){
int sum=;
char *s=argv[i+];
while(*s !='\0'){
sum=sum*+((*s++)-'');
//printf("%c",*s);
//++s;
}
num[i]=sum;
}
/*
for(i=0;i<len;i++){
printf("%d \n",num[i]);
}
*/
int even=my_even(num,len);
int sum=my_sum(num,len);
int ave=my_ave(num,len);
printf("偶数个数:%d,总和:%d,平均值:%d。",even,sum,ave); return ;
}
27、卡拉兹(Callatz)猜想:
对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=1?
#if 0
、卡拉兹(Callatz)猜想:
对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+)砍掉一半。这样一直反复砍下去,
最后一定在某一步得到n= 。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,
拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+),以至于有人说这是一个阴谋,
卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=?
解题思路:
. 获取一个数
. 判断是偶数则除二,是奇数乘三加一
。 循环判断直至得到1; #endif #include<stdio.h> int main(){
int num=;
printf("输入一个1000以内的自然数:");
scanf("%d",&num); while(num!=){
if(num%==){
num/=;
}else if(num%==){
num=num*+;
}
printf("%d\t",num);
}
return ;
}
28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
#include<stdio.h>
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=0;
if(x!=0)
{
if(x>0)
y=1;
else
y=-1;
}
printf("x=%d\ny=%d\n",x,y);
return 0;
}
//28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
#include<stdio.h>
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=;
if(x!=)
{
if(x>)
y=;
else
y=-;
}
printf("x=%d\ny=%d\n",x,y);
return ;
}
29、给定一个不多于5位的正整数,要求:
①求出它是几位数
②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
③将数字逆序。例如输入123,则输出321
#if 0
、给定一个不多于5位的正整数,要求:
①求出它是几位数
②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
③将数字逆序。例如输入123,则输出321
解题思路:
一。对输入数值合法性进行判定
二。判断数据的位数。
三。提取按从高位到低位进行,但将提取的数据按从低位到高位累加可得置逆结果。
错误分析:
本例中应该用一个数组存储提取的每一位的值。
#endif #include<stdio.h>
#include<math.h> int main(){
int num;
int Q=;
int wei=;
int ni=;
printf("输入不大于十万的数");
scanf("%d",&num);
if(num>){
printf("数据过大");
return ;
}
while(num/Q==){
Q=Q/; }
while(Q>){
int a=num/Q;
Q=Q/;
a=a%; printf("第%d位是:%d\n",wei+,a);
ni=ni+pow(,wei)*a;
wei++;
}
printf("\n置逆%d\n",ni); return ;
}
30、使用公式求π的近似值
π/4 = 1 - 1/3 + 1/5 - 1/7 + ……
直到某一项的绝对值小于10^-6为止。
(提示:判断该数字是否小于10^-6,可以使用系统库函数fabs
fabs(f)>=1e-6//1e-6是10^-6的科学计数法表示方式
若要使用fabs()函数,则应包含头文件math.h
#include<math.h>
而且要在编译时添加-lm,即手动添加数学库libm.o
gcc qiupai.c -o qiupai -lm)
#if 0
、使用公式求π的近似值
π/ = - / + / - / + ……
直到某一项的绝对值小于10^-6为止。
(提示:判断该数字是否小于10^-,可以使用系统库函数fabs
fabs(f)>=1e-//1e-6是10^-6的科学计数法表示方式
若要使用fabs()函数,则应包含头文件math.h
#include<math.h>
而且要在编译时添加-lm,即手动添加数学库libm.o
gcc qiupai.c -o qiupai -lm) 解题思路:
一。使用累加结束条件为某一项的绝对值小于10^-6为止。
二。每一项中加减交替,分子为1,分母为奇数递增。
三。累加结果乘四为π的值 错误经历:
将double型的数据以%d形式输出; #endif #include<stdio.h>
#include<math.h> int main(){
double PI;
double sum=;
double item=;
int i=;
double jue=;
//int fp=1;
while(fabs(jue)>=1e-){
if(i>){
i+=;
}else{
i-=;
}
i=-i;
item=(double)/i; sum+=item;
//printf("item=%lf\n",sum); jue=item;
if(jue<){
jue=-jue;
} //fp++;
/*
if(fp>1000){
break;
}
*/ }
PI=sum*;
printf("π=%lf ",PI); return ;
}
C基础的练习集及测试答案(16-30)的更多相关文章
- C基础的练习集及测试答案(提高题)
提高题:1.编写程序,随机生成一个1~10内的数,让对方猜3次.如果3次内能猜中则输出“恭喜你”:若3次内猜不中则输出正确答案.C语言中提供生成随机数的函数rand()用法:①所需头文件:#inclu ...
- C基础的练习集及测试答案(1-15)
练习题:注:标有(课堂)字样的为课上练习,其他为课下练习基础题(50题)1.(课堂)编写程序,输出“XXX欢迎来到动物园!”(XXX是自己的名字). //1.(课堂)编写程序,输出“XXX欢迎来到动物 ...
- C基础的练习集及测试答案(40-50)
40.(课堂)打印杨辉三角型前10行 #if 0 40.(课堂)打印杨辉三角型前10行 思路分析: 一.打印十行杨辉三角得第十行长度为十,所以建立一个长度为十的数组,作为每行的数据存储 二.按 0-9 ...
- C基础的练习集及测试答案(31-39)
31.读懂以下程序,说明程序的功能#include<stdio.h>int main(){ int m,n,r,m1,m2; printf("请输入2个正整数:"); ...
- ML基础 : 训练集,验证集,测试集关系及划分 Relation and Devision among training set, validation set and testing set
首先三个概念存在于 有监督学习的范畴 Training set: A set of examples used for learning, which is to fit the parameters ...
- Python sklearn拆分训练集、测试集及预测导出评分 决策树
机器学习入门 (注:无基础可快速入门,想提高准确率还得多下功夫,文中各名词不做过多解释) Python语言.pandas包.sklearn包 建议在Jupyter环境操作 操作步骤 1.panda ...
- zookeeper部署及集群测试
zookeeper部署及集群测试 环境 三台测试机 操作系统: centos7 ; hostname: c1 ; ip: 192.168.1.80 操作系统: centos7 ; hostname: ...
- hdu 1829 基础并查集,查同性恋
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- Dubbo入门实例 本地伪集群测试Demo
1. 概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提 ...
随机推荐
- Ubuntu 12.04 Eclipse设…
Ubuntu 12.04 Eclipse设置(黑色背景解决) 分类: ubuntu2012-11-21 10:47 252人阅读 评论(0) 收藏 举报 eclipseEclipseubuntuUbu ...
- usb资料2
ubuntu linux下如何在启动时就关闭usb接口? https://zhidao.baidu.com/question/548651197.html Linux USB 驱动开发(四)—— 热插 ...
- JS 上拉加载
$(document).ready( function(){ $contentLoadTriggered = false; $("#mainDiv").scroll(functio ...
- com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_FAILED_ABORTED: User rejected permissions
原因是连接了两个设备,所以无法启动,关掉一个即可
- ldap 报错整理
1.httpd 无法启动 先用systemctl status httpd 查看一下日志 1.提示端口号是否冲突,修改httpd.conf端口号 2.提示没有权限:检查selinux,防火墙是否关闭或 ...
- Linux对外提供服务 网络操作 端口操作 1.开启服务监听端口 2.设置防火墙,放行访问端口的包 iptables&netfilter 四表五链和通堵策略
主题: Linux服务器上软件提供服务 1.网络操作 2.端口操作 1.网络操作 本机必须能够ping通目标主机(本地虚拟机或者远程主机) 2.端口操作 1.开启服务监听端口 2.设置防火墙,放行访问 ...
- Java - 一道关于整型和字符类型相加的题目
题目 public class Test { public static void main(final String[] args) { final int a = 10; final int b ...
- 利用Hough变换识别图像中的直线
引入 近期看到2015年数学建模A题太阳影子定位中的第四问,需要根据附件中视频里的直杆的太阳影子的变化确定拍摄地点.其实确定拍摄地点这个问题并不是十分困难,因为有前三问的铺垫,我们已经得出了太阳影子长 ...
- 题解 UVA11354 【Bond】
并查集+按秩合并 传送门 大意:给出一张n个点m条边的无向图, 每条边有一个权值,有q个询问, 每次给出两个点s.t,找一条路, 使得路径上的边的最大权值最小. 我们可以发现,跑最小生成树会跑挂, 那 ...
- atom通过remote ftp同步本地文件到远程主机的方法
视频教程:https://ninghao.net/video/3991 搜索 “remote ftp”, 点击 “Package”搜索包,Install”安装 本地打开需要同步的项目目录 创建 rem ...