内容正文:
《C语言程序设计》
期末复习卷(三)
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一.程序设计题(本大题共10小题,每小题10分,共100分)
1.函数fun的功能是:计算两个日期之间的天数差。日期格式为整型yyyymmdd。 例如,20240101和20240103相差2天。考虑闰年(能被4整除但不能被100整除, 或者能被400整除的年份为闰年)
#include<stdio.h>
int isLeap(int year){
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int daysInMonth(int year, int month){
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(month == 2 && isLeap(year)) return 29;
return days[month - 1];
}
int fun(int date1, int date2){
int y1 = date1 / 10000, m1 = date1 / 100 % 100, d1 = date1 % 100;
int y2 = date2 / 10000, m2 = date2 / 100 % 100, d2 = date2 % 100;
int days = 0;
/*******space*******/
/*******space*******/
return days;
}
int main(){
int d1 = 20240101, d2 = 20240110;
printf("%d和%d相差%d天
", d1, d2, fun(d1, d2));
return 0;
}
2.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
#include<stdio.h>
int fun(int n){
/*******space*******/
/*******space*******/
}
void main(){
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++) printf("第%d月的兔子总数为%d对",i,fun(n));
}
3.蜗牛爬井问题,一口井深10米,一只蜗牛从井底白天向上爬3米,晚上下滑2米。问第几天能爬出井口?
#include<stdio.h>
void main(){
int h=10;
int current=0,days=0;
/*******space*******/
/*******space*******/
}
4.银行存款问题,某人存入银行1000元,年利率5%,按复利计算。问:多少年后存款会超过2000元?
#include<stdio.h>
void main(){
int year=0;
float s=1000;
/*******space*******/
/*******space*******/
}
5.韩信点兵,有一队士兵,3人一排多2人,5人一排多3人,7人一排多2人。编写程序问最少有多少士兵?
#include <stdio.h>
int main(){
int n = 1;
/*******space*******/
/*******space*******/
return 0;
}
6.爬楼梯问题一段楼梯有 n 级台阶,一次可以跨 1 级或 2 级。问:爬完 n级楼梯一共有多少种不同的方法?
#include <stdio.h>
int climb(int n){
/*******space*******/
/*******space*******/
}
int main(){
int n;
printf("输入台阶数:");
scanf("%d", &n);
printf("共有 %d 种方法
", climb(n));
return 0;
}
7.约瑟夫环问题。n个人围成一圈,从第 1 个人开始报数,数到 m的人出列,再从下一个人继续报数。问:最后剩下的人的初始编号是多少?
#include <stdio.h>
int josephus(int n, int m){
/*******space*******/
/*******space*******/
}
int main(){
int n, m;
printf("输入人数n和报数m:");
scanf("%d %d", &n, &m);
printf("最后剩下的人的编号是:%d
", josephus(n, m));
return 0;
}
8.自守数问题。自守数:一个数的平方的末尾几位等于它本身。例如52=2552=25,252=625252=625。编写程序找出10000以内的所有自守数。
#include <stdio.h>
int main(){
printf("10000以内的自守数:
");
/*******space*******/
/*******space*******/
return 0;
}
9.海边有一座灯塔,分为若干层。最上层有 1 盏灯,第二层有 3 盏,第三层有 5 盏,……每层比上一层多 2 盏。已知总灯数为 169 盏。问:灯塔有多少层?
#include <stdio.h>
int main(){
int total = 169, sum = 0, n = 0;
/*******space*******/
/*******space*******/
printf("灯塔有 %d 层
", n);
return 0;
}
10.一个农妇卖鸡蛋:第一次卖掉总数的一半加半个;第二次卖掉剩下的一半加半个;第三次又卖掉剩下的一半加半个,正好卖完。问:原来有多少个鸡蛋?
#include <stdio.h>
int main() {
int eggs = 0;
/*******space*******/
/*******space*******/
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
《C语言程序设计》
期末复习卷(三)
时间:90分钟 总分:100分
班级 姓名 学号 成绩
一.程序设计题(本大题共10小题,每小题10分,共100分)
1.函数fun的功能是:计算两个日期之间的天数差。日期格式为整型yyyymmdd。 例如,20240101和20240103相差2天。考虑闰年(能被4整除但不能被100整除, 或者能被400整除的年份为闰年)
#include<stdio.h>
int isLeap(int year){
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int daysInMonth(int year, int month){
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
if(month == 2 && isLeap(year)) return 29;
return days[month - 1];
}
int fun(int date1, int date2){
int y1 = date1 / 10000, m1 = date1 / 100 % 100, d1 = date1 % 100;
int y2 = date2 / 10000, m2 = date2 / 100 % 100, d2 = date2 % 100;
int days = 0;
/*******space*******/
if (y1>y2||(y1==y2&&m1>m2)||(y1==y2&&m1==m2&&d1>d2)){
int temp = date1; date1 = date2;
date2 = temp;
y1 = date1 / 10000;
m1 = date1 / 100 % 100;
d1 = date1 % 100;
y2 = date2 / 10000;
m2=date2/100 % 100; d2 = date2 % 100;
}
while(y1<y2||m1<m2||d1<d2){
days++;
d1++;
if (d1>daysInMonth(y1, m1)){
d1 = 1;
m1++;
if (m1 > 12) {
m1 = 1;
y1++;
}
}
}
/*******space*******/
return days;
}
int main(){
int d1 = 20240101, d2 = 20240110;
printf("%d和%d相差%d天
", d1, d2, fun(d1, d2));
return 0;
}
2.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
#include<stdio.h>
int fun(int n){
/*******space*******/
if (n == 1 || n == 2) return 1;
int a = 1, b = 1, c;
for (int i = 3; i <= n; i++){
c = a + b;
a = b;
b = c;
}
return b;
/*******space*******/
}
void main(){
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++) printf("第%d月的兔子总数为%d对",i,fun(n));
}
3.蜗牛爬井问题,一口井深10米,一只蜗牛从井底白天向上爬3米,晚上下滑2米。问第几天能爬出井口?
#include<stdio.h>
void main(){
int h=10;
int current=0,days=0;
/*******space*******/
while(current<h){
days++;
current += 3;
if(current >= h) break;
current -= 2;
}
printf("第%d天爬出井口
", days);
/*******space*******/
}
4.银行存款问题,某人存入银行1000元,年利率5%,按复利计算。问:多少年后存款会超过2000元?
#include<stdio.h>
void main(){
int year=0;
float s=1000;
/*******space*******/
while(s<=2000){
s=s*1.05;
year++;
}
printf("%d年后存款超过2000元,余额为%.2f
", year, s);
/*******space*******/
}
5.韩信点兵,有一队士兵,3人一排多2人,5人一排多3人,7人一排多2人。编写程序问最少有多少士兵?
#include <stdio.h>
int main(){
int n = 1;
/*******space*******/
while(1){
if(n%3==2&&n%5==3&&n%7==2){
printf("最少有 %d 名士兵
", n);
break;
}
n++;
}
/*******space*******/
return 0;
}
6.爬楼梯问题一段楼梯有n级台阶,一次可以跨 1 级或 2 级。问:爬完n级楼梯一共有多少种不同的方法?
#include <stdio.h>
int climb(int n){
/*******space*******/
if (n == 1) return 1;
if (n == 2) return 2;
return climb(n - 1) + climb(n - 2);
/*******space*******/
}
int main(){
int n;
printf("输入台阶数:");
scanf("%d", &n);
printf("共有 %d 种方法
", climb(n));
return 0;
}
7.约瑟夫环问题。n个人围成一圈,从第 1 个人开始报数,数到 m的人出列,再从下一个人继续报数。问:最后剩下的人的初始编号是多少?
#include <stdio.h>
int josephus(int n, int m){
/*******space*******/
int last = 0;
for (int i = 2; i <= n; i++) {
last = (last + m) % i;
}
return last + 1;
/*******space*******/
}
int main(){
int n, m;
printf("输入人数n和报数m:");
scanf("%d %d", &n, &m);
printf("最后剩下的人的编号是:%d
", josephus(n, m));
return 0;
}
8.自守数问题。自守数:一个数的平方的末尾几位等于它本身。例如5^2=25,25^2=6225。编写程序找出10000以内的所有自守数。
#include <stdio.h>
int main(){
printf("10000以内的自守数:
");
/*******space*******/
for(int i = 0; i < 10000; i++){
int square = i * i;
int temp = i, mod = 1;
while (temp){
mod *= 10;
temp /= 10;
}
if (square % mod == i) printf("%d ", i);
}
printf("
");
/*******space*******/
return 0;
}
9.海边有一座灯塔,分为若干层。最上层有 1 盏灯,第二层有 3 盏,第三层有 5 盏,……每层比上一层多 2 盏。已知总灯数为 169 盏。问:灯塔有多少层?
#include <stdio.h>
int main(){
int total = 169, sum = 0, n = 0;
/*******space*******/
while(sum<total){
n++;
sum += 2 * n - 1;
}
/*******space*******/
printf("灯塔有 %d 层
", n);
return 0;
}
10.一个农妇卖鸡蛋:第一次卖掉总数的一半加半个;第二次卖掉剩下的一半加半个;第三次又卖掉剩下的一半加半个,正好卖完。问:原来有多少个鸡蛋?
#include <stdio.h>
int main() {
int eggs = 0;
/*******space*******/
for (int i=0;i<3;i++){
eggs = eggs * 2 + 1 ;
}
printf("原来有 %d 个鸡蛋
", eggs);
/*******space*******/
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$