Lab07 递归与函数
1. 正整数的各位数字之和
#include <stdio.h>
#include <math.h>
int sum(int a);
int main() {
int a = 0;
scanf("%d", &a);
printf("%d", sum(a));
return 0;
}
int sum(int a) {
if (a < 10) {
return a;
}
return sum(a / 10) + a % 10;
}
2. 逆序输出
#include <stdio.h>
#include <math.h>
void scan();
int main() {
scan();
return 0;
}
void scan() {
int a = 0;
scanf("%d", &a);
if (a > 0) {
scan();
printf("%d ", a);
return;
}
return;
}
3. 十进制转二进制
#include <stdio.h>
#include <math.h>
void print(int a);
int main() {
int a = 0;
scanf("%d", &a);
print(a);
return 0;
}
void print(int a) {
if (a == 0){
return;
}
if (a > 0) {
print(a / 2);
printf("%d",a%2);
}
}
5. fibonacci函数
#include <stdio.h>
#include <stdlib.h>
int fibonacci(int a);
int main(void) {
int a = 0;
scanf("%d", &a);
printf("%d", fibonacci(a));
return 0;
}
int fibonacci(int a) {
if (a == 0 || a == 1) {
return a;
}
return fibonacci(a - 1) + fibonacci(a - 2);
}
6. *号构成的菱形图案
#include <stdio.h>
#include <stdlib.h>
void print(int a);
int main(void) {
int n = 0, a = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a);
print(a);
}
return 0;
}
void print(int a) {
int b = a - 1;
int c = 1;
for (int i = 1; i <= a; i++) {
for (int j = 1; j <= b; j++) {
printf(" ");
}
b -= 1;
for (int j = 1; j <= c; j++) {
printf("* ");
}
c += 2;
printf("\n");
}
b = 1;
c = 2*a-3;;
for (int i = 1; i <= a - 1; i++) {
for (int j = 1; j <= b; j++) {
printf(" ");
}
b += 1;
for (int j = 1; j <= c; j++) {
printf("* ");
}
c -= 2;
printf("\n");
}
}
7. 函数调用中的平均值
#include <stdio.h>
#include <stdlib.h>
float RunningAvg(float num);
int main() {
float num;
while (1) {
scanf("%f", &num);
if (num > 0) {
printf("%.2f\n", RunningAvg(num));
} else {
break;
}
}
}
float RunningAvg(float num) {
static float sum = 0;
static int counter = 0;
sum += num;
counter++;
return sum / counter;
}
8. 取模
#include <stdio.h>
#include <math.h>
int mod(int a);
int main(void) {
int a = 0;
scanf("%d", &a);
printf("%d\n", mod(a));
return 0;
}
int mod(int a) {
if (a == 0 || a == 1) {
return 1;
}
return mod(a - 1) * a % 20181111;
}
- 日期间相隔的天数
#include<stdio.h>
int sum(int y, int m, int d) {
int i, count = 0;
for (i = 0; i < y; ++i) {
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
count += 366;
} else {
count += 365;
}
}
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
for (i = 1; i <= m - 1; ++i) {
if (i == 2) {
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
count += 29;
} else {
count += 28;
}
} else {
count += month[i];
}
}
count += d;
return count;
}
int main() {
int y1, y2, m1, m2, d1, d2;
scanf("%d %d %d %d %d %d", &y1, &m1, &d1, &y2, &m2, &d2);
printf("采集时间为%d天\n", sum(y2, m2, d2) - sum(y1, m1, d1));
}
Lab08 数组的基础与应用
9. 长度最小的连续子数组
#include <stdio.h>
int min(int a, int b);
int main() {
int n;
scanf("%d",&n);
int a[10];
for(int i = 0;i<n;i++){
scanf("%d",&a[i]);
}
int s = 7;
scanf("%d",&s);
int left = 0,right = 0, sum = 0, min_length = 10000;
while (right < n) {
sum += a[right];
while (sum >= s) {
min_length = min(min_length, right - left + 1);
sum -= a[left];
left++;
}
right++;
}
printf("%d", min_length<10000?min_length:0);
return 0;
}
int min(int a, int b) {
return a <= b ? a : b;
}
6. 删除数组元素
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
int data[n];
for (int i = 0; i < n; i++) {
scanf("%d", &data[i]);
}
int target;
scanf("%d", &target);
int index = -1;
for (int i = 0; i < n; i++) {
if (data[i] == target) {
index = i;
for (int j = i; j < n - 1; j++) {
data[j] = data[j + 1];
}
break;
}
}
if (index == -1) {
printf("ERROR");
} else {
for (int i = 0; i < n - 1; i++)
printf("%d ", data[i]);
}
}
10. 求最长平台
#include<stdio.h>
int max(int a, int b);
int main(void) {
int n = 0;
scanf("%d", &n);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int length = 0, max_length = 0;
for (int i = 0; i < n; i++) {
if (i == 0) {
length = 1;
} else {
if (a[i] == a[i - 1]) {
length++;
} else {
length = 1;
}
}
max_length = max(length, max_length);
}
printf("%d", max_length);
return 0;
}
int max(int a, int b) {
return a >= b ? a : b;
}
我的评分
#include<stdio.h>
double max(double a, double b);
double min(double a, double b);
int main() {
int n;
scanf("%d", &n);
double score, MIN=1000000001, MAX=-1, sum = 0;
for (int i = 0; i < n; i++) {
scanf("%lf", &score);
MAX = max(MAX, score);
MIN = min(MIN, score);
sum += score;
}
printf("%.2f", (sum - MIN - MAX) / (n - 2));
}
double max(double a, double b) {
return a >= b ? a : b;
}
double min(double a, double b) {
return a < b ? a : b;
}
三数之和
#include<stdio.h>
#include <stdbool.h>
bool not_in(int d[10][3], int length, int a, int b, int c);
int main(void) {
int t, a[10], d[10][3],
a_index = 0, d_length = 0;
while (scanf("%d", &t) == 1) {
a[a_index] = t;
a_index++;
}
for (int i = 0; i < a_index; i++) {
for (int j = i + 1; j < a_index; j++) {
for (int k = j + 1; k < a_index; k++) {
if (a[i] + a[j] + a[k] == 0 && not_in(d, d_length, a[i], a[j], a[k])) {
printf("%d %d %d\n", a[i], a[j], a[k]);
d[d_length][0] = a[i];
d[d_length][1] = a[j];
d[d_length][2] = a[k];
d_length++;
}
}
}
}
return 0;
}
bool not_in(int arr[10][3], int length, int a, int b, int c) {
for (int i = 0; i < length; i++) {
if ((arr[i][0] == a && arr[i][1] == b && arr[i][2] == c) ||
(arr[i][0] == a && arr[i][1] == c && arr[i][2] == b) ||
(arr[i][0] == b && arr[i][1] == a && arr[i][2] == c) ||
(arr[i][0] == b && arr[i][1] == c && arr[i][2] == a) ||
(arr[i][0] == c && arr[i][1] == a && arr[i][2] == b) ||
(arr[i][0] == c && arr[i][1] == b && arr[i][2] == a)) {
return false;
}
}
return true;
}