【数据结构与算法第一章(课后习题)】编程基础:变量与数据类型、指针、结构体、数组与链表、程序结构、函数中的参数传递和C语言中运算符的含义

【数据结构与算法第一章(课后习题)】编程基础

1. 题目一:水仙花数

  • 题目描述:

水仙花数是指一个 N(N ≥ 3)位正整数,它的每个位上的数字的 N 次幂之和等于它本身。例如:153=1^{3}+5^{3}+3^{3}。本题要求编写程序,计算所有 N 位水仙花数。

  • 输入格式:

输入在一行中给出一个正整数 N(3 ≤ N ≤7)。

  • 输出格式: 

按递增的顺序输出所有的 N 位水仙花数,每个数字占一行。

  • 输入样例:

3

  • 输出样例:

153

370

371

407

  •  参考示例:
# include<stdio.h>
# include<math.h>
# define n 8

int main(){
	int N, arr[n];
	scanf("%d", &N);
	if (N < 3 || N > 7) printf("输入有误,请重新输入。");

    //遍历所有的 N 位数
    int min = pow(10, N - 1), max = pow(10, N);
	for (int i = min; i < max; i++) 
	{
        // 得到各位数
		arr[0] = i / 1000000;  
		arr[1] = (i / 100000) % 10;
		arr[2] = (i / 10000) % 10;
		arr[3] = (i / 1000) % 10;
		arr[4] = (i / 100) % 10;
		arr[5] = (i / 10) % 10;
		arr[6] = i % 10;
        
        // 计算是否符合水仙花数
        int sum = 0;
        for (int j = 0; j < 7) sum += pow(arr[j], N);
		if (i == sum) printf("%d\n", i);
	}
  return 0;
}

2. 题目二:计算分段函数

  • 题目描述:

本题目要求计算下列分段函数 f(x) 的值:

y=f(x)=\left\{\begin{matrix} \frac{1}{x}, x\neq 0 & \\ 0,x=0 & \end{matrix}\right.

  • 输入格式:

输入在一行中给出实数 x 。

  • 输出格式: 

在一行中按 “ f(x) = result ” 的格式输出,其中 x 和 result 都保留一位小数。

  • 输入样例:

10

  • 输出样例:

f(10.0) = 0.1

  • 参考示例:
# include<stdio.h>

int main() {
	float x, result;
	scanf("%f", &x);
	if (x == 0)  result = 0;
	else  result = 1 / x;
	printf("f(%.1f)=%.1f", x, result);
	return 0;
}

3. 题目三:求奇数分之一序列前 N 项和

  • 题目描述:

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前 N 项之和。

  • 输入格式:

输入在一行中给出正整数 N 。

  • 输出格式: 

在一行中按照 “sum=S” 的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

  • 输入样例:

23

  • 输出样例:

sum = 2.549541

  • 参考示例:
# include<stdio.h>
int main() {
	int N;
	double sum = 0;
	scanf("%d", &N);

    // i用来求和,b用来计数,使用1.0保证结果非整型
	for (int i = 1, b = 1; b <= N; i += 2, b++) sum += (1.0 / i); 
	printf("sum=%.6lf", sum);
	return 0;
}

4. 题目四:求阶乘序列序列前 N 项和

  • 题目描述:

本题要求编写程序,计算序列  1! + 2! + 3! + ... 的前 N 项之和。

  • 输入格式:

输入在一行中给出一个不超过12的正整数 N 。

  • 输出格式: 

在一行中输出整数结果。

  • 输入样例:

5

  • 输出样例:

153

  • 参考示例:
# include<stdio.h>

// factorial是一个阶乘的函数
int factorial(int n) {
	int result=1;
	for (int i = n; i >= 1; i--) result *= i;
	return result;
}

int main() {
	int N, sum=0;
	scanf("%d", &N);

    //将所有阶乘累加求和
	for (int i = 1; i <= N; i++) sum += factorial(i);
	printf("%d", sum);
	return 0;
}

5. 题目五:字符串逆序

  • 题目描述:

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

  • 输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

  • 输出格式: 

在一行中输出逆序后的字符串。

  • 输入样例:

Hello World!

  • 输出样例:

!dlroW olleH

  • 参考示例:
# include<stdio.h>
# include<string.h>
int main() {
    //创建一个数组b来存储倒序的数组
	char a[80] = {}, b[80] = {};
	int b_num = 0;
	gets_s(a);
	for (int i = strlen(a) - 1; i >= 0; i--)
	{
		b[b_num] = a[i];
		b_num++;
	}
	puts(b);
	return 0;
}

6. 题目六:字符串字母大小写转换

  • 题目描述:

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

  • 输入格式:

输入为一个以“#”结束的字符串(不超过30个字符)。

  • 输出格式: 

在一行中输出大小写转换后的结果字符串。

  • 输入样例:

Hello World! 123#

  • 输出样例:

hELLO wORLD! 123

  • 参考示例:
# include<stdio.h>
# include<string.h>

int main() {
    //创建一个新数组b来存储转换后的数组
	char a[40] = {}, b[40] = {};
	gets_s(a);
	for (int i = 0; a[i] != '#'; i++)
	{
        //对字符串中的元素进行大小写的判断
		if (a[i] >= 'a' && a[i] <= 'z') b[i] = a[i] - 32; 
		else if (a[i] >= 'A' && a[i] <= 'Z') b[i] = a[i] + 32;
		else b[i] = a[i];
	}
	puts(b);
	return 0;
}

7. 题目七:比较大小

  • 题目描述:

本题要求将输入的任意3个整数从小到大输出。

  • 输入格式:

输入在一行中给出3个整数,其间以空格分隔。

  • 输出格式: 

在一行中将3个整数从小到大输出,其间以“->”相连。

  • 输入样例:

4 2 8

  • 输出样例:

2->4->8

  • 参考示例:
# include<stdio.h>
int main() {
	int a, b, c;

    //用max,mid,min分别记录a,b,c中的最大值,中间值和最小值
	int max, mid, min;
	scanf("%d %d %d", &a, &b, &c);

	// 查找最大值
    max = a > b ? (a > c ? a : c) : (b > c ? b : c);
    // 查找最小值
    min = a < b ? (a < c ? a : c) : (b < c ? b : c);
    // 查找中间值
    mid = (a + b + c) - max - min;

	printf("%d->%d->%d", min, mid, max);
	return 0;
}

8. 题目八:求矩阵最大值

  • 题目描述:

本题要求编写程序,求一个给定的 m x n 矩阵的最大值以及位置。题目保证最大值唯一。

  • 输入格式:

第一行给出两个正整数 m、n ( 1 < m, n <6) 。随后 m 行每行给出 n 个整数,其间以空格分隔。

  • 输出格式: 

输出在第一行中输出最大值,在第二行中按照“行下标列下标”(下标从0开始)的格式输出最大值的位置。

  • 输入样例:

3 2
6 3
23 -9
6 -1

  • 输出样例:

23
10

  • 参考示例:
# include<stdio.h>
int main() {
	int m, n;
	//用max,max_row,max_line分别记录矩阵的最大值及其行下标和列下标
	int max, max_row, max_line;
	scanf("%d %d", &m, &n);
	int a[20][20] = {};
	//输入矩阵的值,i为行数,j为列数
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)
			scanf("%d", &a[i][j]);

	max = a[0][0], max_row = 0, max_line = 0;
	for (int i = 0; i < m; i++)//遍历整个矩阵进行比较
		for (int j = 0; j < n; j++)
			if (a[i][j] > max)
			{
				max = a[i][j];
				max_row = i;
				max_line = j;
			}

	printf("%d\n", max);
	printf("%d %d", max_row, max_line);
	return 0;
}

9. 题目九:猴子吃桃问题

  • 题目描述:

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第 N 天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

  • 输入格式:

输入在一行中给出正整数 N ( 1< N ≤ 10 )。

  • 输出格式: 

在一行中输出第一天共摘了多少个桃子。

  • 输入样例:

3

  • 输出样例:

10

  • 参考示例:
# include<stdio.h>

//编写一个递归函数F以计算第N天桃子的个数
int F(int N) {
	if (N==1) return 1;
	return  (F(N- 1) +1)*2;
}

int main() {
	int N;
	scanf("%d", &N);
	printf("%d", F(N));
	return 0;
}

10. 题目十:递归实现指数函数

  • 题目描述:

本题要求用递归实现一个计算 x" ( n > 1 ) 的函数。

  • 函数接口定义:

double calc_pow( double x, int n );

// 函数calc_pow返回x的n次幂的值。建议用递归实现。题目保证结果在双精度范围内。

  • 裁判测试程序样例: 
#include <stdio.h>

double calc_pow( double x, int n );

int main(){
    double x;
    int n;
    scanf("%lf %d",&x,&n);
    printf("%.0f\n",calc_pow(x,n));
    return 0;
}

/*你的代码将被嵌在这里 */
  • 输入样例:

2 3

  • 输出样例:

8

  • 参考示例: 
double calc_pow(double x, int n)
{
	if (n ==1) return x;
	return calc_pow(x, n - 1) * x;
}
  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值