【数据结构与算法第一章(课后习题)】编程基础
1. 题目一:水仙花数
- 题目描述:
水仙花数是指一个 N(N ≥ 3)位正整数,它的每个位上的数字的 N 次幂之和等于它本身。例如:
。本题要求编写程序,计算所有 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) 的值:
- 输入格式:
输入在一行中给出实数 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;
}