一些小的程序趣味算法题

mac2026-02-07  0

找了一些程序题,分享给大家

1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第四,A第一; 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。 #include<stdio.h> void BiSai(int A, int B, int C, int D, int E) { for (A = 1; A <= 5; ++A) { for (B = 1; B <= 5; ++B) { for (C = 1; C <= 5; ++C) { for (D = 1; D <= 5; ++D) { for (E = 1; E <= 5; ++E) { if ((B == 2) + (A == 3) == 1 && (B == 2) + (E == 4) == 1 && (C == 1) + (D == 2) == 1 && (C == 5) + (D == 3) == 1 && (E == 4) + (A == 1) == 1) { if (A*B*C*D*E == 120) { printf("A是第%d名\n", A); printf("B是第%d名\n", B); printf("C是第%d名\n", C); printf("D是第%d名\n", D); printf("E是第%d名\n", E); } } } } } } } } int main() { int A = 0; int B = 0; int C = 0; int D = 0; int E = 0; BiSai(A, B, C, D, E); return 0; }

这题主要理解题意就好,当时我也很懵逼。不做赘述。理解就好。

2. 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个。 嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。 int main() { int k = 0; for (k = 'A'; k <= 'D'; k++) { if ((k != 'A') + (k == 'C') + (k == 'D') + (k != 'D') == 3) { printf("k=%c\n", k); return 0; } } return 1; }

这个题主要就是那个循坏的搭建,直接用ASCII码值进行循环,在内循环中满足条件即可。不做赘述。

3. 有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student". 要求: 不能使用库函数。 只能开辟有限个空间(空间个数和字符串的长度无关)。 static int my_strlen(const char *str)//实现strlen函数,确定字符产有多大 { int count = 0; while (*str) { count++; str++; } return count; } static void reverse_arr(char *left, char *right)//逆置字符串函数 { while (left < right) { char temp = *right; *right = *left; *left = temp; left++; right--; } } void reverse(char *str)//在逆置函数之后在设定空格以及‘/0’处在逆置 { assert(str != NULL); char *left = str; char *right = str + my_strlen(str) - 1; char *cur = str; reverse_arr(left, right); while (*cur) { char *start = cur; while ((*cur != ' ') && (*cur != '\0')) { cur++; } reverse_arr(start, cur - 1); if (*cur == ' ') { cur++; } } } int main() { char arr[] = "student a am i"; reverse(arr); printf("%s\n", arr); return 0; } 2.喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水, 给20元,可以多少汽水。 编程实现。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int num(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } if (n % 2 == 0) { return n + num(n / 2); } else { return (n - 1) + num((n / 2) + 1); } } int main() { int n = 0; printf("请问你要花费多少钱?\n"); scanf("%d", &n); printf("%d元可以喝%d瓶汽水!!\n", n, num(n)); system("pause"); return 0; } 4.1.求出0999999之间的所有“水仙花数”并输出。 “水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身, 如;1531^35^33^3?,则153是一个“水仙花数”。 1234=1^4 + 2^4 + 3^4 +4^4 /* 在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、 阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数, 其各个数之N次方和等于该数。 例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数: 153 = 1^3 + 5^3 + 3^3。 370 = 3^3 + 7^3 + 0^3。 371 = 3^3 + 7^3 + 1^3。 407 = 4^3 + 0^3 + 7^3。 1234 = 1^4+2^4+3^4+4^4 */ int main() { int n; int a[10] = { 0 }; int i; int sum = 0; int count = 0; for (n = 0; n < 100000;++n) { for (i = n; i; i = i / 10) { a[count] = i % 10;//存放每一位数字 ++count;//存放位数 } for (i = 0; i < count; ++i) { sum += pow(a[i], count); } if (n == sum) { printf("%d \n", n); } count = sum = 0; } return 0; } 任意数范围的水仙花数 #include<stdlib.h> #include<math.h> int main() { int k; printf("请输入一个数:"); scanf("%d", &k); int n; int a[10] = { 0 }; int i; int sum = 0; int count = 0; for (n = 0; n < k;++n) { for (i = n; i; i = i / 10) { a[count] = i % 10; ++count; } for (i = 0; i < count; ++i) { sum += pow(a[i], count); } if (n == sum) { printf("%d \n", n); } count = sum = 0; } return 0; }
最新回复(0)