C语言基础练习题及代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

读前须知:
1.此文档为UP主在为期11周的c语言学习课程中做过的在线测评
练习题,题目和UP主自己写的代码都在这里。

2.由于水平有限,所用的算法并不是很简洁,部分题目是暴力循环
破解的。

精益求精者请自行思考或百度。

3.由于课业紧张,写的时候几乎没有写注释,排版也比较紧凑,这
些可能会给读者的理解带来困难,在此先说一声抱歉。

4.由于老师教的不好,学习过程中不大愉悦,因此用了一些恶趣味
的单词作为变量名泄愤,恳请不要在意这些细节…
5.由于学校以在线测评的方式考核,UP主并没有考虑各种人性化的
细节例如输入范围限制,输入提示等。

如果程序是写给人用的,请务必考虑这些人性化设置。

6.本文档仅供各位网友参考学习c语言之用,读者擅自用作他途所
造成的一切不良后果与UP主无关。

身高预测
【问题描述】
父母都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高因素包括遗传、饮食习惯与体育锻炼等。

小孩成人后的身高与其父母的身高和自身的性别密切相关设fatH为其父身高,motH为其母身高,身高预测公式为
男性成人时身高=(fatH+motH)*0.54 cm
女性成人时身高=(fatH*0.923+motH)/2 cm
此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生习惯,那么可增加身高1.5%。

请编程利用给定公式和身高预测方法对身高进行预测。

【输入】
输入由键盘输入,共5行。

第一行有一个字符sex,代表用户的性别(F或f代表女性,M或m代表男性)
第二行有一个实数fatH,代表父亲身高
第三行有一个实数motH,代表母亲身高
第四行有一个字符spor,代表是否喜爱体育锻炼(Y或y代表喜爱锻炼,N或n代表不喜爱锻炼)
第五行有一个字符diet,代表是否有良好的饮食习惯(Y或y代表饮食习惯良好,N或n代表饮食习惯不好)
【输出】
输出只有1行,为所预测的身高hei(不保留小数),输出格式为Your future height will be hei(cm)
【样例输入】
f
176
160
y
y
【样例输出】
Your future height will be 167(cm)
【数据范围】
对于fatH,motH,hei,保证100%的数据不超过double类型的范围
对于sex,spor,diet,保证没有非法数据
【注释】
hint1: 数据输入时请考虑\n的影响
hint2: cms系统将所有warning均视为error
hint3: main()函数请使用int main(),否则会提示编译错误。

/*==================================================================*/ #include<stdio.h>
int main()
{
double fatH,motH,hei,in;
char sex,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;
}
else if ((sex=='M')||(sex=='m'))
{
hei=(fatH+motH)*0.54;
}
else beyond='e';
if ((spor=='y')||(spor=='Y'))
{
in=in+0.02;
}
else if ((spor=='n')||(spor=='N')) in=in;
else beyond='e';
if ((diet=='y')||(diet=='Y'))
in=in+0.015;
}
else if ((diet=='n')||(diet=='N')) in=in;
else beyond='e';
hei=hei*in;
if (beyond!='e')
printf("Your future height will be %.0lf(cm)",hei);
else printf("the data you input is wrong,please check it out and input again.");
return 0;
}
/*==================================================================*/
猜数游戏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, 7 time(s)
【样例过程2】
>1
Small
>2
Small
>3
Small
>4
>5
Small
>6
Small
>7
Small
>8
Small
>9
Small
>10
Small
over
【注释】
hint1: “>”行代表为用户输入
hint2: 请使用“do while”循环实现
hint3: 该题为离线评测,程序提交过后不会立即得到成绩,请耐心等待批改
/*=================================================================*/ #include<stdio.h>
#include<stdlib.h>
int main()
{
int guess,ra,times;
ra=rand()%100;
times=1;
printf("please guess a number in 0~100\n");
do
{
scanf(" %d",&guess);
if (guess==ra)
{
printf("Right,%d time(s)",times);
times=12;
break;
}
else if (guess<ra) printf("Small\n");
else printf("Big\n");
times++;
} while (times<=10);
if (times!=12) printf("over");
return 0;
}
/*==================================================================*/
猜数游戏2
【问题描述】
编程由计算机生成一个1~100之间的整数请用户猜,若猜对则输出用户猜测次数(输出格式:“Right, [猜测次数] time(s)”);若猜错则给出提示——若用户所猜数偏大,则输出“Big”,否则输出“Small”。

一次游戏最多可以猜10次,若经过10次仍未猜中的话,输出“over”;一轮游戏结束之后,询问用户是否进行下一轮游戏(输出格式:“continue? Y || N”),并等待用户响应(若“Y”、“N”输入非法,则重复询问)。

另外,要求程序能够判断非法数据,若用户输入非法,输出“illegal input”,然后让用户重新输入。

【样例过程1】
>50
Small
>75
Small
>80
Small
>90
Small
>95
Small
>98
Right, 6 time(s)
continue? Y || N
>Y
>50
Small
>75
Big
>60
Big
>55
Small
>57
Small
>58
Small
>59
Right, 7 time(s)
continue? Y || N
【样例过程2】
>a
illegal input
>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<stdio.h>
#include<stdlib.h>
int main()
{
int guess,ra,times,mark;
char c,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,%d time(s)",times);
mark=15;
break;
}
else if ((guess>=0)&&(guess<ra))
{
printf("Small\n");
getchar();
times++;
}
else if ((guess<=100)&&(guess>ra))
{
printf("Big\n");
getchar();
times++;
}
else
{
printf("illegal input\n");
getchar();
mark=times-1;
}
}
else
{
printf("illegal input\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 ("illegal input\n");
d='i';
}
}
while (d=='i');
}
return 0;
}
/*==================================================================*/
无重复数字的三位数
【问题描述】
有0、1、2...9十个数字,编程计算这10个数字能组成多少个互不相同且无重复数字的三位数(如:123,124,125...),并列举所组成的三位数。

【输出】
输出共两行:
第一行为符合条件的三位数个数
第二行从小到大依次输出这些满足条件的三位数,相邻两个数之间用1个空格隔开。

【注释】
hint1: 关注所输出的最后一个满足条件的三位数
/*================================================================*/
#include<stdio.h>
int main()
{
int i,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++;
}
else if (i!=k&&j!=k&&n!=647)
{
s=100*i+10*j+k;
printf("%d ",s);
n++;
}
}
}
}
/*printf("xx\n%d",n);*/
return 0;
}
/*==================================================================*/
求最大公约数,从大到小试探法
【问题描述】
编程用试探法(要求从大到小试探)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。

【输入】
输入由键盘输入,只有1行
这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]”
【输出】
输出共1行,为m和n的最大公约数,输出格式为“The result is [所求最大公约数]!”【样例输入】
2,1
【样例输出】
The result is 1!
【数据范围】
保证100%的数据在int范围内
【注释】
hint1: 请严格按照题目要求完成任务
/*=============================================================*/
#include<stdio.h>
int gcd(int m,int n)
{
int i,s,f;
f=m;
if (f<n) f=n;
for (i=f;i>=1;i--) if (m%i==0&&n%i==0) {s=i;break;}
return s;
}
int main()
{
int mm,nn,lzsb;
scanf("%d,%d",&mm,&nn);
lzsb=gcd(mm,nn);
printf("The result is %d!",lzsb);
}
/*==============================================================*/
求最大公约数,辗转相除法
【问题描述】
编程用辗转相除法(不使用递归)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。

【输入】
输入由键盘输入,只有1行
这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]”
【输出】
输出共1行,为m和n的最大公约数,输出格式为“The result is [所求最大公约数]!”【样例输入】
2,1
【样例输出】
The result is 1!
【数据范围】
保证100%的数据在int范围内
【注释】
hint1: 请严格按照题目要求完成任务
/*==================================================================*/ #include<stdio.h>
int gcd(int m,int n)
{
int illness,kill,death,shit;
illness=m;
if (illness<n) {illness=n;kill=m;}
else kill=n;
do
{
shit=kill%illness;
kill=illness;
illness=shit;
} while (shit!=0);
return kill;
}
int main()
{
int mm,nn,doubi;
scanf("%d,%d",&mm,&nn);
doubi=gcd(mm,nn);
printf("The result is %d!",doubi);
}
/*=============================================================*/
求最大公约数,递归
【问题描述】
编程用辗转相除法(使用递归调用)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。

【输入】
输入由键盘输入,只有1行
这一行有两个正整数m,n,代表待求最大公约数的两个数,输入格式为“[m],[n]”
【输出】
输出共1行,为m和n的最大公约数,输出格式为“The result is [所求最大公约数]!”【样例输入】
2,1
【样例输出】
The result is 1!
【数据范围】
保证100%的数据在int范围内
【注释】
hint1: 请严格按照题目要求完成任务
/*==================================================================*/ #include<stdio.h>
int gcd(int m,int n)
{
int dawa,erwa,shit;
dawa=m;
if (dawa<n) {dawa=n;erwa=m;}
else erwa=n;
shit=dawa%erwa;
if (shit!=0) erwa=gcd(erwa,shit);
return erwa;
}
int main()
{
int dou,bi,doubi;
scanf("%d,%d",&dou,&bi);
doubi=gcd(dou,bi);
printf("The result is %d!",doubi);
return 0;
}
/*==================================================================*/
猴子分桃
[ UP主吐槽:这些天生神力的猴子能一次搬上亿只桃子,请考虑数据超限的问题,题目所说的数据范围不够用。

]
【问题描述】有1堆桃子共m 个,由n 只猴子分配这些桃子。

每次到达桃子堆放地的猴子只有1只,而且每个猴子都会平均分 1 次桃子。

第1只到达的猴子将桃子平均分成n 等份,但发现多k ( k < n )个,于是,将多余的k个扔掉,然后拿走其中的1份。

第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
【样例输入】
3 1
【样例输出】
25
【数据范围】保证100%数据不超过int范围
/*================================================================*/
#include<stdio.h>
int main()
{
long m,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<ma) ma=m;
}
printf("%d",ma);
return 0;
}
/*=============================================================*/
约瑟夫问题
【问题描述】
n个人围成一圈,顺序编号。

从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。

【输入】
输入由键盘输入,只有一行
这一行有一个正整数n,代表n个人围成一圈
【输出】
输出共一行,为最后留下来的那个人的编号
【样例输入】
5
【样例输出】
4
【数据范围】
保证100%数据2<=n<=200
/*==============================================================*/ #include<stdio.h>
int main()
{
int idiot[201];
int i,san,left,db;
scanf("%d",&db);
for (i=0;i<db;i++) {idiot[i]=0;}
i=-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;i<db;i++)
if (idiot[i]==0) printf("%d",i+1);
return 0;
}
/*=================================================================*/
约瑟夫问题,链表法
【问题描述】
n个人围成一圈,顺序编号。

从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。

(要求用链表法)
【输入】
输入由键盘输入,只有一行
这一行有一个正整数n,代表n个人围成一圈
【输出】
输出共一行,为最后留下来的那个人的编号
【样例输入】
5
【样例输出】
4
【数据范围】
保证100%数据2<=n<=200
/*=================================================================*/
#include<stdio.h>
#include<stdlib.h>
int hollyshit=0;
struct fucklb
{
int data;
struct fucklb *nxx;
};
struct fucklb *App(struct fucklb *head)
{
struct fucklb *ppp=NULL , *ppr=head;
int data;
ppp=(struct fucklb *)malloc(sizeof(struct fucklb));
if (ppp==NULL) exit(0);
if (head==NULL) head=ppp;
else
{
while(ppr->nxx !=NULL) ppr=ppr->nxx;
ppr->nxx=ppp;
}
ppp->data=hollyshit;
ppp->nxx=NULL;
return head;
}
int main()
{
int mmd,nmb;
struct fucklb *ass=NULL , *hole=NULL;
/*读入与初始化*/
scanf("%d",&mmd);
for (nmb=1;nmb<=mmd;nmb++)
{
hollyshit++;
ass=App(ass);
}
/*把链表首尾相接*/
hole=ass;
while(hole->nxx!=NULL) hole=hole->nxx;
hole->nxx=ass;
/*寻踪阶段,每三个节点删掉一个直到删去mmd-1个*/ nmb=0;
while(mmd!=1)
{
nmb++;
if (nmb==2)
{
nmb=0;
hole=ass->nxx;
ass->nxx=ass->nxx->nxx;
free(hole);
mmd--;
}
ass=ass->nxx;
}
printf("%d",ass->data);
return 0;
}
/*================================================================*/
求1~n之间所有素数之和
【问题描述】
编程求解1到n之间所有素数之和
【输入】
输入由键盘输入,只有1行
这一行只有一个正整数n,代表需要计算1到n之间所有素数之和
【输出】
输出共1行,这一行只有一个整数,代表1~n之间所有素数之和
【样例输入】
100
【样例输出】
1060
【数据范围】
保证100%数据,1<=n<=100000
【注释】
hint1: 请使用函数实现素数判定,定义函数原型:int isprime(int k);
/*===============================================================*/
#include<stdio.h>
#include<math.h>
long isprime(long k)
{
long j,ax,mark;
mark=0;
/*scanf("%d",&k);/**/
ax=sqrt(k)/1;
if (k%2!=0)
for (j=3;j<=ax;j++)
{
if (k%j==0) { mark=1;break;}
}
else mark=1;
if (k==2) mark=0;
/*printf("%d--k,%d--j,%d--ax,%d--mark\n",k,j,ax,mark);/**/
return mark;
}
int main()
{
long sum,a,b;
sum=0;
scanf("%ld",&a);
for (b=2;b<=a;b++)
{
if (isprime(b)==0) sum=sum+b;
}
printf("%ld",sum);
return 0;
}
/*==================================================================*/
检验幻方矩阵
【问题描述】
对一个5*5的正整数矩阵,判断该矩阵是否为幻方矩阵。

所谓幻方矩阵,是每一行、每一列、每条对角线上元素之和都相等的矩阵
例如矩阵:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
就是一个幻方矩阵
【输入】
输入由键盘输入,共5行,为待判断的矩阵
(每行两个数字之间仅有一个空格,由于排版所以此处并没严格按一个空格来显示)
【输出】
输出共1行,为判断结果,若原矩阵是幻方矩阵,输出“It is a magic square!”;若原矩阵非
幻方矩阵,输出“It is not a magic square!”
【样例输入1】
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
【样例输出1】
It is a magic square!
【样例输入2】
2 24 1 8 15
23 5 4 14 16
4 6 13 20 22
10 11 19 21 3
11 18 1 2 9
【样例输出2】
It is not a magic square!
/*==================================================================*/ #include<stdio.h>
int main()
{
int fb[5][5];
int i,j,s,mark;
for (i=0;i<=4;i++)
scanf("%d %d %d %d %d",&fb[i][0],&fb[i][1],&fb[i][2],&fb[i][3],&fb[i][4]);
mark=0;
/*check dialogo n*/
s=fb[0][0]+fb[1][1]+fb[2][2]+fb[3][3]+fb[4][4];
if (s!=fb[0][4]+fb[1][3]+fb[2][2]+fb[3][1]+fb[4][0]) mark=1;/*printf("%d",mark);/**/
for (j=0;j<=4;j++)
{
if (s!=fb[0][j]+fb[1][j]+fb[2][j]+fb[3][j]+fb[4][j]) mark=1;/*printf("%d",mark);/**/
if (s!=fb[j][0]+fb[j][1]+fb[j][2]+fb[j][3]+fb[j][4]) mark=1;/*printf("%d",mark);/**/
}
if (mark==0) printf("It is a magic square!");
else if (mark==1) printf("It is not a magic square!");
return 0;
}
/*===================================================================*/
斐波那契数列平均值
【问题描述】
求斐波那契数列前n项的平均值,要求将斐波那契数列的每一项存入数组中。

【输入】
输入由键盘输入,只有1行
这一行有一个正整数n,为待运算的斐波那契数列的项数
【输出】
输出共1行,为计算所得平均数(保留小数点后3位),格式:“the average:[平均数]”【样例输入】
10
【样例输出】
the average:14.300
【数据范围】
保证100%的数据,0<n<=50
请使用long long声明数组,用%lld输出long long数据类型
/*==============================================================*/ #include<stdio.h>
int main()
{
long long fb[51];
long n,i;
double a,s;
fb[0]=0;
fb[1]=1;
scanf("%ld",&n);
s=0;
for (i=2;i<=n;i++)
{
fb[i]=fb[i-1]+fb[i-2];
/*if (i%5==0) printf("%lld\n",fb[i]);*/
}
for (i=1;i<=n;i++) s=s+fb[i];
if (n!=0) a=s/(n*1.00);
else a=0;
printf("the average:%.3lf",a);
return 0;
}
/*==================================================================
/*===============================================================*/
/*-----------------------------------------------------------------------------------------------------------*/
/*----------------------------------以下为课后小习题部分-------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------*/
/*===============================================================*/
判断某天是这一年的第几天
输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

输入样例:
2000.1.1
输出样例:
1
/*===============================================================*/
#include<stdio.h>
int main()
{
int a,b,c,n;
scanf("%d.%d.%d",&a,&b,&c);
n=(b-1)*31+c;
if (b>4) n--;
if (b>6) n--;
if (b>9) n--;
if (b>11) n--;
if (b>2)
if (a%4==0) n=n-2;
else n=n-3;
printf("%d",n);
return 0;
}
/*===============================================================*/
分解质因数
题目:将一个正整数分解质因数。

例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

/*=================================================================*/ #include<stdio.h>
int main()
{
long a,b,n,i,mar;
scanf("%ld",&n);
printf("%ld=",n);
mar=0;
b=2;
a=n;
for (i=2;i<a;i++)
{
if (n%i==0)
{
if (mar!=0) printf("*");
printf("%ld",i);
n=n/i;
i--;
mar++;
}
}
if (mar==0) printf("%ld",n);
return 0;
}
/*===================================================================*/
字符串字符统计
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

程序分析:利用while或for语句,条件为输入的字符不为'\n'.
输入样例:
123 abc /*-+
输出样例:
character:3
number:3
space:2
others:4
/*=================================================================*/ #include<stdio.h>
int main()
{
char p,a[51];
int i,j,k,l;
for (i=1;i<=50,p!='\n';i++)
{
scanf("%c",&p);
a[i]=p;
}
l=i-1;
k=i-1;
j=0;
for (i=1;i<=l;i++) if ((a[i]>='A')&&(a[i]<='Z')||(a[i]>='a')&&(a[i]<='z')) j++;
printf("character:%d\n",j);
k=k-j;
j=0;
for (i=1;i<=l;i++) if (a[i]>='0'&&a[i]<='9') j++;
printf("number:%d\n",j);
k=k-j;
j=0;
for (i=1;i<=l;i++) if (a[i]==' ') j++;
printf("space:%d\n",j);
k=k-j;
j=0;
printf("others:%d\n",k-1);
return 0;
}
/*=================================================================*/
求两个正整数的最小公倍数
题目:输入两个正整数m和n,求其最小公倍数。

输入样例:
1 2
输出样例:
2
/*=============================================================*/
#include<stdio.h>
int main()
{
long a,b,i,m,n;
scanf("%ld %ld",&a,&b);
n=a*b;
m=n;
for (i=2;i<m;i++)
{
if (a%i==0&&b%i==0&&n%(i*i)==0)
{
n=n/i;
a=a/i;
b=b/i;
i--;
}
}
printf("%ld",n);
return 0;
}
/*=============================================================*/
水仙花数
【问题描述】
“水仙花数”是指一种三位数,其各位数字立方和等于该数本身。

例如:153=1^3+5^3+3^3,所以153是一个“水仙花数”。

请编程输出所有的“水仙花数”。

【输出】
输出共若干行,每行输出一个水仙花数
【注释】
hint1: 请勿人脑计算后直接输出答案
hint2: a^b表示a的b次幂
/*=============================================================*/
#include<stdio.h>
int main()
{
int i,j,k,l;
long s;
for (i=100;i<=999;i++)
{
j=i%10;
k=(i%100)/10;
l=i/100;
s=j*j*j+k*k*k+l*l*l;
if (i==s) printf("%d\n",i);
}
return 0;
}
/*=============================================================*/
哥德巴赫猜想
【问题描述】
一个大于2的偶数总可以表示为两个素数之和。

输入一个偶数n,编程输出一个素数对a、b(a<=b),使得n=a+b,并且使a与b之差最大。

【输入】
输入由键盘输入,只有一行
这一行有一个正整数n,代表被拆分的偶数
【输出】
输出共一行,为偶数被拆分所得的两个素数,这两个数之间用一个空格隔开
【样例输入】
4
【样例输出】
2 2
【数据范围】
保证100%数据4<=n<=5000
【注释】
hint1: 不要纠结在哥德巴赫猜想上
/*=============================================================*/
#include<stdio.h>
#include<math.h>
long isprime(long k)
{
long j,ax,mark;
mark=0;
/*scanf("%d",&k);/**/
ax=sqrt(k)/1;
if (k%2!=0)
for (j=3;j<=ax;j++)
{
if (k%j==0) { mark=1;break;}
}
else mark=1;
if (k==2) mark=0;
/*printf("%d--k,%d--j,%d--ax,%d--mark\n",k,j,ax,mark);/**/
return mark;
}
int main()
{
int a,b,n,i;
scanf("%d",&n);
for (i=2;i<n;i++)
{
a=i;
b=n-i;
if ((isprime(a)==0)&&(isprime(b)==0)) break;
}
printf("%d %d",a,b);
return 0;
}
/*=============================================================*/
月份天数
【问题描述】
编程显示用户输入月份的天数
【输入】
输入由键盘输入,只有一行
这一行为询问的月份的英文简写
【输出】
输出共1行,代表所对应月份的天数。

输出格式为The number of days is [天数]
【样例输入】
Jan
【样例输出】
The number of days is 31
【注释】
hint1: 月份对应英文简写:一月Jan 二月Feb 三月Mar 四月Apr 五月May 六月Jun 七月Jul 八月Aug 九月Sep 十月Oct 十一月Nov 十二月Dec
hint2: 不考虑闰年情况
/*=============================================================*/
#include<stdio.h>
int main()
{
char mon[3];
int i,j;
scanf("%c%c%c",&mon[0],&mon[1],&mon[2]);
switch(mon[0])
{
case'A': if (mon[1]=='p') printf("The number of days is 30");
else printf("The number of days is 31");break;
case'J': if (mon[1]=='u'&&mon[2]=='n') printf("The number of days is 30");
else printf("The number of days is 31");break;
case'S':printf("The number of days is 30");break;
case'N':printf("The number of days is 30");break;
case'F':printf("The number of days is 28");break;
default:printf("The number of days is 31");
}
return 0;
}
/*=============================================================*/
长方形
[ UP主吐槽:这道题是编程之美比赛2013年的海选题,计算思路和公式网上有详解。

]
描述
在N 条水平线与M 条竖直线构成的网格中,放K 枚石子,每个石子都只能放在网格的交叉点上。

问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。

输入
输入文件包含多组测试数据。

第一行,给出一个整数T,为数据组数。

接下来依次给出每组测试数据。

每组数据为三个用空格隔开的整数N,M,K。

输出
对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示最多能找到的符合条件的长方形数量。

所有数据按读入顺序从1开始编号。

数据范围
1 ≤T ≤100
0 ≤K ≤N * M
0 < N, M ≤30
样例输入
3
3 3 8
4 5 13
7 14 86
样例输出
Case #1: 5
Case #2: 18
Case #3: 1398
/*=============================================================*/
#include<stdio.h>
#include<stdlib.h>
struct data
{
int m;
int n;
int k;
long result;
struct data* next;
};
/*===============*/
struct data* incr(struct data* now)
{
struct data *pa=NULL,*pb=NULL;
int m,n,k;
/* */
pa=(struct data*)malloc(sizeof(struct data));
if (pa!=NULL&&scanf("%d %d %d",&m,&n,&k)==3)
{
if (m>=n) /*为简化计算,一律令大数为m。

*/ {
pa->m=m;
pa->n=n;
}
else
{
pa->m=n;
pa->n=m;
}
pa->k=k;
pa->result=0;
pa->next=NULL;
pb=now;
if (now==NULL) {now=pa;return now;}
else
{
while (pb->next!=NULL) pb=pb->next;
pb->next=pa;
return now;
}
}
else {printf("wrong!");return now;}
}
/*=====================*/
long comp(int m,int n,int k)
int a,b,lf;
long r,rmax=0;
if (k<=1||m<=1||n<=1) return 0;
a=0;
while ((a+1)*(a+1)<k) a++; /*找到正方形排布下的边长a*/
if (n<a) a=k/n; /*如果边长超出限定范围,则取k/n作为长边*/
b=k/a; /*b是短边*/
while (b>n) b=k/++a; /*b超限时的处理,a和b不可能同时超限*/
lf=k%a; /*lf为余项*/
while (a<=m&&b>=2) /*遍历由正方形到长条的各种数字*/
{
r=(a*b*(a-1)*(b-1)/4);
if (a+1<=m&&lf<=b) r=r+(lf*(lf-1)*a/2); /*余项排布在长侧,因为加成更大所以优先*/
else
{
if (b+1<=n) r=r+(lf*(lf-1)*b/2); /*余项排布在短侧*/
else {if (a+1<=m&&lf>b) /*这种是余项小于长边但大于短边边长的情况*/
{
if (a+2<=m) r=r+(b*(b-1)*a/2)+((lf-b)*(lf-b-1)*a/2);
else r=r+(b*(b-1)*a/2)+((lf-b)*(lf-b-1)*b/2);
}}
}
if (r>rmax) rmax=r;
a++;
b=k/a;
lf=k%a;
}
return rmax;
}
/*====================*/
int main()
{
int gp=0,i;
struct data* head=NULL;
struct data* calc=NULL;
/* */
scanf("%d\n",&gp);//getchar();
for (i=1;i<=gp;i++) head=incr(head);
calc=head;
for (i=1;i<=gp;i++)
{
calc->result=comp(calc->m,calc->n,calc->k);
printf("Case #%d: %ld\n",i,calc->result);
calc=calc->next;
}
return 0;
}
/*=============================================================*/
终焉
[ UP主吐槽:UP主上的c语言课又短又讲得不好,也就只能到这种程度了。

在线测评网上还有两道题Up主做不到全对就没好意思放进这里面来。

最后的结课考试难就算了还是用英文写的题目而且还有UP主没学过的c++的题目冒出来,简直麻痹。

考完试闲了一小会就做了这份文档消遣消遣。

网上大神多的是,上面代码写的不好的还请轻喷……]。

相关文档
最新文档