7-21 出租车计价
#include<stdio.h>
int main() {
double length;
int wtime;
scanf("%lf", &length);
scanf("%d", &wtime);
double sum = 0;
if (length <= 3) {
sum += 10;
} else if (length <= 10) {
sum += 10 + (length - 3) * 2;
} else if (length > 10) {
sum += 10 + 7 * 2 + (length - 10) * 3;
}
if (wtime >= 5) {
sum += wtime / 5 * 2;
}
printf("%.0f", sum);
return 0;
}
7-22 统计学生成绩
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
int temp;
int a = 0, b = 0, c = 0, d = 0, e = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &temp);
if (temp >= 90) {
a++;
} else if (temp >= 80) {
b++;
} else if (temp >= 70) {
c++;
} else if (temp >= 60) {
d++;
} else {
e++;
}
}
printf("%d %d %d %d %d", a, b, c, d, e);
return 0;
}
7-23 三角形判断
#include<stdio.h>
#include<math.h>
int main() {
double x1, x2, y1, y2, x3, y3;
scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
double l1 = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
double l2 = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2));
double l3 = sqrt(pow(x3 - x1, 2) + pow(y3 - y1, 2));
// 判断是否构成三角形
double q = (l1 + l2 + l3) / 2;
double area = sqrt(q * (q - l1) * (q - l2) * (q - l3));
if (l1 + l2 <= l3 || l2 + l3 <= l1 || l1 + l3 <= l2) {
printf("Impossible\n");
} else {
printf("L = %.2lf, A = %.2lf\n", l1 + l2 + l3, area);
}
return 0;
}
7-24 打印沙漏
#include<stdio.h>
#include<math.h>
int main() {
int k;
char c;
scanf("%d %c", &k, &c);
int n = sqrt((k + 1) / 2);
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
printf(" ");
}
for (int j = 0; j < (n - i) * 2 - 1; j++) {
printf("%c", c);
}
printf("\n");
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < n - i; j++) {
printf(" ");
}
for (int j = 0; j < i * 2 + 1; j++) {
printf("%c", c);
}
printf("\n");
}
printf("%d", k - (n * n * 2 - 1));
return 0;
}
7-25 数组元素循环右移问题
#include<stdio.h>
int main() {
int n, offset;
scanf("%d", &n);
scanf("%d", &offset);
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int i = 0;
for (; i < n - 1; i++) {
int index = (i - offset) % n;
if (index < 0) {
index += n;
}
printf("%d ", arr[index]);
}
for (; i < n; i++) {
int index = (i - offset) % n;
if (index < 0) {
index += n;
}
printf("%d", arr[index]);
}
return 0;
}
7-26 Have Fun with Numbers
#include <stdio.h>
#include <string.h>
#define MAX_DIGITS 21
// 计算字符串的翻倍结果,并返回结果字符串
void double_string(const char *num, char *result) {
int carry = 0;
int len = strlen(num);
int index = 0;
// 从最后一位开始逐位相乘
for (int i = len - 1; i >= 0; i--) {
int digit = (num[i] - '0') * 2 + carry;
result[index++] = (digit % 10) + '0'; // 取当前位
carry = digit / 10; // 进位
}
// 处理进位
while (carry > 0) {
result[index++] = (carry % 10) + '0';
carry /= 10;
}
result[index] = '\0';
// 反转结果字符串
for (int i = 0; i < index / 2; i++) {
char temp = result[i];
result[i] = result[index - 1 - i];
result[index - 1 - i] = temp;
}
}
// 函数:检查两个字符串是否是数字的排列
int is_permutation(const char *original, const char *doubled) {
int count[10] = {0}; // 统计数字0-9的出现次数
for (int i = 0; original[i] != '\0'; i++) {
count[original[i] - '0']++;
}
for (int i = 0; doubled[i] != '\0'; i++) {
count[doubled[i] - '0']--;
}
for (int i = 0; i < 10; i++) {
if (count[i] != 0) {
return 0; // 不是排列
}
}
return 1; // 是排列
}
int main() {
char input[MAX_DIGITS];
char doubled_str[MAX_DIGITS * 2]; // 可能需要更大的空间来存储翻倍结果
// 输入数字
scanf("%s", input);
// 计算翻倍
double_string(input, doubled_str);
// 检查是否是数字的排列
if (is_permutation(input, doubled_str)) {
printf("Yes\n");
} else {
printf("No\n");
}
printf("%s\n", doubled_str);
return 0;
}
7-27 猜数字游戏
#include<stdio.h>
int main() {
int guessnum;
scanf("%d", &guessnum);
int guessmax;
scanf("%d", &guessmax);
int num;
int cnt = 0;
while (true) {
scanf("%d", &num);
cnt++;
if (num < 0) {
if (cnt == 1) {
printf("Game Over\n");
}
break;
}
if (cnt > guessmax) {
printf("Game Over\n");
return 0;
}
if (num == guessnum) {
if (cnt == 1) {
printf("Bingo!\n");
} else if (cnt == 2 || cnt == 3) {
printf("Lucky You!\n");
} else {
printf("Good Guess!\n");
}
return 0;
} else if (num < guessnum) {
printf("Too small\n");
} else {
printf("Too big\n");
}
}
return 0;
}
7-28 求e的近似值
#include<stdio.h>
int main() {
double sum = 1;
int n;
scanf("%d", &n);
double fact = 1;
for (int i = 1; i <= n; i++) {
fact *= i;
sum += 1.0 / fact;
}
printf("%.8f\n", sum);
return 0;
}
7-29 找出最小值
#include<stdio.h>
int main() {
int n;
scanf("%d", &n);
int min;
int flag = 1;
for (int i = 0; i < n; i++) {
int temp;
scanf("%d", &temp);
if (flag) {
min = temp;
}
flag = 0;
if (temp < min) {
min = temp;
}
}
printf("min = %d\n", min);
return 0;
}
7-30 统计素数并求和
#include<stdio.h>
int isPrime(int n) {
if (n <= 1) {
return 0;
}
for (int i = 2; i < n; i++) {
if (n % i == 0) return 0;
}
return 1;
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
int cnt = 0;
int sum = 0;
for (int i = m; i <= n; i++) {
if (isPrime(i)) {
cnt++;
sum += i;
}
}
printf("%d %d\n", cnt, sum);
return 0;
}