浙大版《C语言程序设计(第3版)》题目集(编程题q41-q50)
习题4-5 换硬币 (20分)
将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
#include "stdio.h"
int main()
{
int x;
int fen5=0,fen2=0,fen1=0;
int total =0,count=0;
scanf("%d",&x);
for(int k=x/5; k>0; k--){
for(int j=x/2;j>0;j--){
for(int i=x;i>0;i--){
if(i+2*j+5*k==x){
count++;
total=i+j+k;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",k,j,i,total);
}
}
}
}
printf("count = %d",count);
return 0;
}
习题4-6 水仙花数 (20分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 本题要求编写程序,计算所有N位水仙花数。
#include "stdio.h"
#include "math.h"
int main()
{
int N,min,max;
int i,a,b;
int item,sum=0;
scanf("%d",&N);
min=pow(10,N-1);
max=pow(10,N)-1;
for(i=min;i<=max;i++){
a=i;
sum=0;
while(a>0){
b=a%10; //取末位
a/=10;
item=pow(b,N);
sum+=item;
}
if(sum==i){
printf("%d\n",i);
}
}
return 0;
}
在这里插入代码片
习题4-7 最大公约数和最小公倍数 (15分)
本题要求两个给定正整数的最大公约数和最小公倍数。
#include "stdio.h"
int main()
{
int a,b,c,m,n;
scanf("%d %d",&m,&n);
if(m<n){ //使用辗转相除法要保证m>n
c=m;
m=n;
n=c;
}
a=m;
b=n;
while(b!=0){
c=a%b;
a=b;
b=c;
}
printf("%d %d",a,m*n/a); //最小公倍数=两数乘积/最大公约数
return 0;
}
习题4-8 高空坠球 (20分)
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
#include "stdio.h"
int main()
{
int n=0,cnt=0;
double sum=0,h=0;
scanf("%lf %d",&h,&n); //初始高度,n
while(h!=0&&cnt<n){
sum+=h;
cnt++;
h=h/2;
sum+=h; //距离为下落高度和反弹高度(反弹高度为下落高度一半)
}
if(n==0){
sum=0;
h=0;
}else{
sum=sum-h; //落地时的距离不包括反弹
}
printf("%0.1f %0.1f",sum,h);
return 0;
}
习题4-9 打印菱形图案 (15分)
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
#include "stdio.h"
int main()
{
int n;
scanf("%d",&n);
int mid=(n/2)+1; //打印菱形即为打印两个三角形,先找到中间线
for(int i=1;i<=mid;i++){
for(int j=mid-i;j>0;j--){
printf(" "); //输出空格
}
for(int k=0;k<(2*i-1);k++){
printf("* "); //输出*号
}
printf("\n"); //一行输完后回车
}
for(int i=1;i<mid;i++){
for(int j=0;j<i;j++){
printf(" ");
}
for(int k=(mid-i)*2-1;k>0;k--){
printf("* ");
}
printf("\n");
}
return 0;
}
习题4-10 猴子吃桃问题 (15分)
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
#include "stdio.h"
int main()
{
int N;
int num=1; //倒着考虑,最后一天还是1个
scanf("%d",&N);
for(int i=1;i<=N-1;i++){ //从最后一天到第二天循环
num=(num+1)*2;
}
printf("%d",num);
return 0;
}
习题4-11 兔子繁衍问题 (15分)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
#include"stdio.h"
int main()
{
int N;
scanf("%d",&N);
if(N==1){
printf("1");
}
else{
int i,x1,x2,x;
x1=1,x2=1,x=0;
for(i=2;x2<N;i++){ //斐波那契数列问题
x=x1+x2;
x1=x2;
x2=x;
}
printf("%d",i);
}
return 0;
}
习题6-7 简单计算器 (20分)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
#include "stdio.h"
int main()
{
int i,sum,isnan=0;
char op='0';
scanf("%d",&sum);
while(op!='='){
scanf("%c",&op);
if(op=='='){
break;
}
scanf("%d",&i);
if(op=='+'){
sum=sum+i;
}else if(op=='-'){
sum=sum-i;
}else if(op=='*'){
sum=sum*i;
}else if(op=='/'){
if(i!=0) {
sum=sum/i;
}
else{
isnan=1;
}
}
else{
isnan=1;
}
}
if(isnan==1){
printf("ERROR");
}
else
printf("%d\n",sum);
return 0;
}
习题6-8 统计一行文本的单词个数 (15分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
#include "stdio.h"
int main()
{
char str;
int cnt=0,flag=0;
str=getchar();
while(str!='\n'){
if(str!=' ')
flag=1;
if(flag==1&&str==' '){
cnt++;
flag=0;
}
str=getchar();
}
if(flag==1)
cnt++;
printf("%d",cnt);
return 0;
}
练习7-2 求最大值及其下标 (20分)
本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。
#include "stdio.h"
int main()
{
int n;
int a[10]; //(n<=10)
scanf("%d",&n);
for (int i =0;i<n;i++ ){
scanf("%d",&a[i]);
}
int max=0; //令最大值为0
for(int j=1;j<n;j++){
if(a[j]>a[max]){
max=j;
}
}
printf("%d %d",a[max],max);
return 0;
}