c语言基础编程入门练习题(三)
[编程入门]求和训练
题目描述
求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和
输入格式
a b c
输出格式
1+2+…+a + 12+22+…+b^2 + 1/1+1/2+…+1/c
样例输入
100 50 10
样例输出
47977.93
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 函数声明
double sum_a(double n);
double sum_b(double n);
double sum_c(double n);
int main() {
double a, b, c;
scanf("%lf %lf %lf", &a, &b, &c);
double sum_he = sum_a(a) + sum_b(b) + sum_c(c); // 计算总和
printf("%.2lf\n", sum_he); // 打印总和
return 0;
}
// 计算从1到n的自然数之和
double sum_a(double n) {
double sum = 0;
sum = (n * (n + 1)) / 2;
return sum;
}
// 计算从1到n的平方和
double sum_b(double n) {
double sum = 0;
for (double i = 1; i <= n; i++) {
double temp = i * i;
sum = sum + temp;
}
return sum;
}
// 计算从1到n的倒数和
double sum_c(double n) {
double sum = 0;
for (double i = 1; i <= n; i++) {
double temp = 1 / i;
sum = sum + temp;
}
return sum;
}
[编程入门]水仙花数判断
题目描述
打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=13+53+33。
输入格式
无
输出格式
输出每一个水仙花数,一个数占一行
样例输入
无
样例输出
无
参考代码
#define _CRT_SECURE_NO_WARNINGS
//分割出每一位数,求立方和,相加跟原数比较
//注意刷新和(res),数组序号i
//参考代码 :
#include <stdio.h>
int main() {
long x;
int a[20];
int i, j, k;
long res;
for (x = 2; x < 1000; x++) {
long t = x;
i = 0; // 重置 i
res = 0; // 重置 res
// 将数字分解成各个位并存入数组
while (t != 0) {
a[i] = t % 10;
t = t / 10;
i++;
}
// 计算各位数字的立方和
//for (j = i - 1; j >= 0; j--)
for (j = 0; j <= i-1; j++)
{
res += a[j] * a[j] * a[j];
}
// 检查是否满足条件
if (res == x) {
printf("%ld\n", x);
}
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
// 遍历所有三位数
for (int num = 100; num <= 999; num++) {
int hundreds = num / 100; // 获取百位数字
int tens = (num / 10) % 10; // 获取十位数字
int ones = num % 10; // 获取个位数字
// 计算各位数字的立方和
int sum = pow(hundreds, 3) + pow(tens, 3) + pow(ones, 3);
// 如果立方和等于该数字,输出该数字
if (sum == num) {
printf("%d\n", num);
}
}
return 0;
}
[编程入门]有规律的数列求和
题目描述
有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前N项之和,保留两位小数。
输入格式
N
输出格式
数列前N项和
样例输入
10
样例输出
16.48
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int N;
double fz = 2.0, fm = 1.0;
double an=0.0,sum=0.0;
scanf("%d", &N);
for (int i = 1; i <= N; i++) { //循环从第二项开始计算
an = fz / fm;
double temp = fz; //定义临时变量存储分子
fz = fz + fm;
fm = temp;
sum += an;
}
printf("%.2lf", sum);
return 0;
}
[编程入门]自由下落的距离计算
题目描述
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
输入格式
M N
输出格式
它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行
样例输入
1000 5
样例输出
31.25 2875.00
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
double M; //高度落下
int N; //N次落地
double q = 0.5; //公比q
double an,sn;
scanf("%lf %d", &M, &N);
an = M * pow(q, N );
sn = (2*(M * (1 - pow(q, N))) / (1 - q))-M; //计算公式2倍sn减an
printf("%.2lf %.2lf\n", an, sn);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
void calc(double M, int N) {
double height = M / pow(2, N );// 第 N 次反弹的高度
double distance = M; // 初始下落的距离
double current_fall = M / 2; // 第一次反弹后下落的距离
// 循环计算
for (int i = 1; i < N; i++) {
distance += 2 * current_fall; // 每次反弹和下落的距离
current_fall /= 2; // 下次反弹后的下落高度减半
}
printf("%.2f %.2f\n", height, distance); // 输出保留两位小数
}
int main() {
double M;
int N;
scanf("%lf %d", &M, &N); // 输入 M 和 N
calc(M, N); // 计算并输出结果
return 0;
}
[编程入门]猴子吃桃的问题
题目描述
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
输入格式
N
输出格式
桃子总数
样例输入
10
样例输出
1534
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
int N; //天数
int num=1;//最后桃子个数
scanf("%d", &N);
for (int i = 1; i <= N-1; i++) {
num = (num + 1) * 2;
}
printf("%d", num);
return 0;
}
[编程入门]筛选N以内的素数
题目描述
用简单素数筛选法求N以内的素数。
输入格式
N
输出格式
2~N的素数
样例输入
100
样例输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h> //bool
#include <math.h>
// 判断一个数是否是素数
bool is_prime(int n) {
if (n <= 1) {
return false; // 0 和 1 不是素数
}
//for (int i = 2; i * i <= n; i++) { // 只需要判断到 sqrt(n)
//只需要判断 n 是否能被从 2 到 √n 范围内的数整除。
// 如果 n 能够被某个数 i(2 ≤ i ≤ √n)整除,那么 n 就不是素数;
for (int i = 2; i <= sqrt(n); i++) { // 只需要判断到 sqrt(n)
if (n % i == 0) {
return false; // 如果能被整除,则不是素数
}
}
return true; // 否则是素数
}
void print_su(int N) {
for (int i = 2; i <= N; i++) {
if (is_prime(i)) {
printf("%d\n", i); // 输出素数
}
}
printf("\n");
}
int main() {
int N;
// 输入 N
scanf("%d", &N);
// 打印 N 以内的素数
print_su(N);
return 0;
}
[编程入门]选择排序
题目描述
用选择法对10个整数从小到大排序。
输入格式
输入10个无序的数字
输出格式
排序好的10个整数
样例输入
4 85 3 234 45 345 345 122 30 12
样例输出
3
4
12
30
45
85
122
234
345
345
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void selection_sort(int arr[], int n) {
int i, j, minIndex, temp;
// 遍历整个数组
for (i = 0; i < n - 1; i++) {
minIndex = i; // 假设当前元素是最小的
// 在未排序部分中找到最小元素
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 更新最小元素的索引
}
}
// 如果 minIndex 发生变化,则交换最小元素与当前元素
if (minIndex != i) {
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
void print_array(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d\n", arr[i]);
}
printf("\n");
}
int main() {
int arr[10];
int n = 10;
for (int i = 0; i < n; i++) { // 输入 10 个整数
scanf("%d", &arr[i]);
}
selection_sort(arr, n); // 使用选择排序进行排序
print_array(arr, n); // 输出排序后的数组
return 0;
}
[编程入门]最大公约数与最小公倍数
题目描述
输入两个正整数m和n,求其最大公约数和最小公倍数。
输入格式
两个整数
输出格式
最大公约数,最小公倍数
样例输入
5 7
样例输出
1 35
参考代码
#include <stdio.h>
// 函数声明
int max(int a, int b);// 求最大公约数的函数实现(使用欧几里得算法)
int min(int m, int n, int max_value);// 求最小公倍数的函数实现
int main() {
int m, n;
scanf("%d %d", &m,&n); // 输入两个正整数
int max_value = max(m, n); // 计算最大公约数
int min_value = min(m, n, max_value); // 计算最小公倍数
printf("%d %d\n", max_value, min_value);
return 0;
}
int max(int a, int b) {
while (b != 0) { // 求最大公约数的函数实现(使用欧几里得算法)
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int min(int m, int n, int max_value) {
return (m * n) / max_value; // 求最小公倍数的函数实现
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int max_gy(int a, int b){ //计算最大公约数
int c=1; //while 循环中要赋值c,切c不能等于0
while (c != 0) {
c= a % b;
a = b;
b = c;
}
return a;
}
int min_gb(int m, int n) {
int gb;
gb = (m * n) / max_gy(m, n);
return gb;
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
printf("%d %d", max_gy(m, n), min_gb(m, n));
return 0;
}
[编程入门]矩阵对角线求和
题目描述
求一个3×3矩阵对角线元素之和。
输入格式
矩阵
输出格式
主对角线 副对角线 元素和
样例输入
1 2 3
1 1 1
3 2 1
样例输出
3 7
参考代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int arr[3][3];
int n = 3;
int sum1 = 0, sum2=0; //定义主、副对角线
for (int i = 0; i < n; i++) { //
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < n; i++) {
sum1 += arr[i][i];
sum2 += arr[2 - i][i];
}
printf("%d %d\n", sum1,sum2);
return 0;
}