C语言新手教程之编程练习汇总 |
|
旁观者
L21
• 2020-12-28 • 回复 19 • 最后编辑于2020-12-28 01:21 • 只看楼主
• 举报
|
目录
第一章、递归调用(13道)
1.汉诺塔:请输入盘子数,输出盘子移动的操作步骤。
#include <stdio.h>
void move(char from, char to) {
printf("%c to %c\n", from, to);
}
void hanoi(int n, char a, char b, char c) {
if (n == 1)
move(a, c);
else {
hanoi(n - 1, a, c, b);
move(a, c);
hanoi(n - 1, b, a, c);
}
}
void main() {
int n;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
}
2.爬楼梯:树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。
#include <stdio.h>
int stair(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return stair(n - 1) + stair(n - 2);
}
void main() {
int n;
scanf("%d", &n);
printf("%d", stair(n));
}
3.爬楼梯:树老师爬楼梯,他可以每次走1级、2级或者3级,输入楼梯的级数,求不同的走法数。
#include <stdio.h>
int stair(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
return stair(n - 1) + stair(n - 2) + stair(n - 3);
}
void main() {
int n;
scanf("%d", &n);
printf("%d", stair(n));
}
4.斐波那契数列:请输入项数,输出具体数列。
#include <stdio.h>
int fibonacci(int n) {
if (n == 1 || n == 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
void main() {
int n, i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
printf("%d,", fibonacci(i));
}
5.求阶乘:请输入整数n,求1!+2!+3!+4!+5!+6!+7!+…+n!的和。
#include <stdio.h>
int factorial(int n) {
if (n == 1) return 1;
return n * factorial(n - 1);
}
void main() {
int n, i, sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
sum += factorial(i);
printf("sum=%d", sum);
}
6.取球问题:在n个球中,任意取m个(不放回),求有多少种不同取法。
#include <stdio.h>
int ball(int n, int m) {
if (n < m) return 0;
if (n == m) return 1;
if (m == 0) return 1;
return ball(n - 1, m - 1) + ball(n - 1, m);
}
void main() {
int n, m;
scanf("%d%d", &n, &m);
printf("%d", ball(n, m));
}
7.杨辉三角:输入要打印的层数,打印杨辉三角。
#include <stdio.h>
int triangle(int m, int n) {
if (m == 0 || n == 0 || m == n)
return 1;
return triangle(m - 1, n) + triangle(m - 1, n - 1);
}
void main() {
int n, i, j;
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j <= i; j++) {
printf("%d ", triangle(i, j));
}
printf("\n");
}
}
8.求年龄:有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?
#include <stdio.h>
int age(int n) {
if (n == 1) return 10;
return age(n - 1) + 2;
}
void main() {
printf("%d", age(5));
}
9.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第十天早上想再吃时,见只剩下一个桃子了。问最初有多少个桃子。
递归:
#include <stdio.h>
int peach(int n) {
if (n == 10) return 1;
return (peach(n + 1) + 1) * 2;
}
void main() {
printf("%d", peach(1));
}
循环:
#include <stdio.h>
void main() {
int i, s = 1;
for (i = 9; i >= 1; i--) {
s = (s + 1) * 2;
}
printf("%d", s);
}
10.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。第十天同样是吃了前一天的一半加一个,最后剩下一个桃子。问最初有多少个桃子。
递归:
#include <stdio.h>
int peach(int n) {
if (n == 11) return 1;
return (peach(n + 1) + 1) * 2;
}
void main() {
printf("%d", peach(1));
}
循环:
#include <stdio.h>
void main() {
int i, s = 1;
for (i = 10; i >= 1; i--) {
s = (s + 1) * 2;
}
printf("%d", s);
}
11.最大公约数:利用递归算法求两个数的最大公约数。
#include <stdio.h>
/* 最大公约数 */
int gcd(int a, int b) {
int t;
if (a < b) {
t = a;
a = b;
b = t;
}
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
void main() {
int a, b;
scanf("%d%d", &a, &b);
printf("gcd=%d", gcd(a, b));
}
12.逆序输出:输入一个正整数,将该正整数逆序输出。
#include <stdio.h>
void printDigit(int n) {
printf("%d", n % 10);
if (n > 10) {
printDigit(n / 10);
}
}
void main() {
int n;
scanf("%d", &n);
printDigit(n);
}
13.逆序输出:输入一个字符串,将该字符串逆序输出。
#include <stdio.h>
void printStr(char *str) {
if (*str != '\0')
printStr(str + 1);
if (*str != '\0')
printf("%c", *str);
}
void main() {
char str[100];
gets(str);
printStr(str);
}
第二类、特殊数字(24道)
1.奇数:输出1-1000之间所有的奇数。
#include <stdio.h>
void main() {
int i;
for (i = 1; i <= 1000; i++)
if (i % 2 == 1)
printf("%d,", i);
}
2.偶数:输出1-1000之间所有的偶数。
#include <stdio.h>
void main() {
int i;
for (i = 1; i <= 1000; i++)
if (i % 2 == 0)
printf("%d,", i);
}
3.素数:输出1-1000之间所有的素数。
#include <stdio.h>
void main() {
int i, j;
for (i = 1; i <= 1000; i++) {
for (j = 2; j < i; j++)
if (i % j == 0)
break;
if (i == j)
printf("%d,", i);
}
}
4.完数:输出1-1000之间所有的完数。
#include <stdio.h>
void main() {
int i, j, s;
for (i = 1; i <= 1000; i++) {
s = 0;
for (j = 1; j < i; j++)
if (i % j == 0)
s += j;
if (i == s)
printf("%d,", i);
}
}
5.回文数:输出100-999之间所有的回文数。
#include <stdio.h>
void main() {
int i, g, b;
for (i = 100; i <= 999; i++) {
g = i % 10;
b = i / 100;
if (g == b)
printf("%d,", i);
}
}
6.水仙花数:输出100-999之间所有的水仙花数。
#include <stdio.h>
void main() {
int i, g, s, b;
for (i = 100; i <= 999; i++) {
g = i % 10;
s = i / 10 % 10;
b = i / 100;
if (g * g * g + s * s * s + b * b * b == i)
printf("%d,", i);
}
}
7.中位数:计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。现在给出n个正整数,求它们的中位数。
#include <stdio.h>
/* 冒泡排序 */
void sort(int a[], int n) {
int i, j, t;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
void main() {
int a[100], n, i;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
sort(a, n);
if (n % 2 == 1) {
printf("%d", a[n / 2]);
} else {
printf("%.2f", (a[n / 2] + a[n / 2 - 1]) / 2.0);
}
}
8.完全平方数:若一个数能表示成某个数的平方的形式,则称这个数为完全平方数。
#include <stdio.h>
#include <math.h>
int ISquare(int n) {
int m = (int) sqrt(n);
if (m * m == n)
return m;
return 0;
}
void main() {
int n, p;
scanf("%d", &n);
if (p = ISquare(n))
printf("%d是完全平方数,%d=%d*%d\n", n, n, p, p);
else
printf("%d非完全平方数\n", n);
}
9.随机数:生成100个1(含1)-100(含100)之间的随机数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int getRand(int min, int max) {
return rand() % (max - min + 1) + min;
}
void main() {
int i;
srand(time(NULL));
for (i = 1; i <= 100; i++) {
printf("%d\n", getRand(1, 100));
}
}
10.求年份:输出2000(含2000)-2020(含2020)之间所有的闰年年份。
#include <stdio.h>
void main() {
int y;
for (y = 2000; y <= 2020; y++)
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
printf("%d,", y);
}
11.求数字:求两个整数的最大公约数及最小公倍数。
#include <stdio.h>
/* 最大公约数 */
int gcd(int a, int b) {
int t;
if (a < b) {
t = a;
a = b;
b = t;
}
while (b != 0) {
t = a % b;
a = b;
b = t;
}
return a;
}
/* 最小公倍数 */
int lcm(int a, int b, int c) {
return a * b / c;
}
void main() {
int x, y, a, b;
scanf("%d%d", &a, &b);
x = gcd(a, b);
y = lcm(a, b, x);
printf("gcd=%d,lcm=%d", x, y);
}
12.求数字:一个整数,它加上100后是一个完全平方数,它加上168又是一个完全平方数,请问该数是多少?
#include <stdio.h>
#include <math.h>
void main() {
int i = 1, x, y;
while (1) {
x = (int) sqrt(i + 100);
y = (int) sqrt(i + 168);
if ((x * x == i + 100) && (y * y == i + 168)) {
printf("%d", i);
break;
}
i++;
}
}
13.求数字:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
#include <stdio.h>
#include <math.h>
void main() {
int i = 1, x, y;
while (1) {
x = (int) sqrt(i + 100);
y = (int) sqrt(i + 100 + 168);
if ((x * x == i + 100) && (y * y == i + 100 + 168)) {
printf("%d", i);
break;
}
i++;
}
}
14.求数字:求所有的四位数中,原数的9倍与其逆序相等的数。
#include <stdio.h>
void main() {
int i, a, b, c, d;
for (i = 1000; i <= 9999; i++) {
a = i % 10;
b = i / 10 % 10;
c = i / 100 % 10;
d = i / 1000;
if (9 * i == a * 1000 + b * 100 + c * 10 + d)
printf("%d", i);
}
}
15.求数字:输出2000(含2000)-3000(含3000)之间所有十位数是m(0<=m<=9)且是n的倍数的数。
#include <stdio.h>
void main() {
int m, n, i;
scanf("%d %d", &m, &n);
for (i = 2000; i <= 3000; i++)
if (i / 10 % 10 == m && i % n == 0)
printf("%d,", i);
}
16.求数字:输入一个整数n,输出100(含100)-999(含999)之间所有各位数字之和等于n的数。
#include <stdio.h>
void main() {
int n, a, b, c, i;
scanf("%d", &n);
for (i = 100; i <= 999; i++) {
a = i / 100;
b = i / 10 % 10;
c = i % 10;
if (a + b + c == n)
printf("%d,", i);
}
}
17.求数字:求1(含1)-200(含200)中,能同时被2、5除余1的整数。
#include <stdio.h>
void main() {
int i;
for (i = 1; i <= 200; i++)
if (i % 2 == 1 && i % 5 == 1)
printf("%d,", i);
}
18.求数字:输出100(含100)-999(含999)之间所有是7的倍数的回文数。
#include <stdio.h>
void main() {
int i, a, c;
for (i = 100; i <= 999; i++) {
a = i / 100;
c = i % 10;
if (a == c && i % 7 == 0)
printf("%d,", i);
}
}
19.求数字:输出100(含100)-200(含200)以内的十位数字为5,百位和个位的和是6的倍数的所有的数。
#include <stdio.h>
void main() {
int i, a, b, c;
for (i = 100; i <= 200; i++) {
a = i / 100;
b = i / 10 % 10;
c = i % 10;
if (b == 5 && (a + c) % 6 == 0)
printf("%d,", i);
}
}
20.求数字:输出100(含100)-200(含200)以内的满足以下条件的数,条件为:这个数与3的和是5的倍数,与3的差是6的倍数,输出这样的数。
#include <stdio.h>
void main() {
int i;
for (i = 100; i <= 200; i++)
if ((i + 3) % 5 == 0 && (i - 3) % 6 == 0)
printf("%d,", i);
}
21.求数字:找出乘积为399的两个相邻奇数。
#include <stdio.h>
void main() {
int i = 1;
while (i * (i + 2) != 399)
i = i + 2;
printf("%d,%d", i, i + 2);
}
22.求位数:输入一个正整数,输出它是几位数?
#include <stdio.h>
void main() {
int n, count = 1;
scanf("%d", &n);
while (n = n / 10) {
count++;
}
printf("%d", count);
}
23.求数和:输入一个正整数,求其各位之和。
#include <stdio.h>
void main() {
int n, sum = 0;
scanf("%d", &n);
while (n > 0) {
sum += n % 10;
n = n / 10;
}
printf("%d", sum);
}
24.相反数:输入一个正整数,输出它的相反数。
#include <stdio.h>
void main() {
int n, sum = 0;
scanf("%d", &n);
while (n > 0) {
sum = sum * 10 + n % 10;
n = n / 10;
}
printf("%d", sum);
}
第三类、多维数组(08道)
1.上下对称反转
#include <stdio.h>
void main() {
int arr[4][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
};
int i, j, t;
int rows = sizeof(arr) / sizeof(arr[0]);
int cols = sizeof(arr[0]) / sizeof(arr[0][0]);
for (i = 0; i < rows / 2; i++) {
for (j = 0; j < cols; j++) {
t = arr[rows - 1 - i][j];
arr[rows - 1 - i][j] = arr[i][j];
arr[i][j] = t;
}
}
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++)
printf("%-5d", arr[i][j]);
printf("\n");
}
}
2.左右对称反转
#include <stdio.h>
void main() {
int arr[4][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
};
int i, j, t;
int rows = sizeof(arr) / sizeof(arr[0]);
int cols = sizeof(arr[0]) / sizeof(arr[0][0]);
for (i = 0; i < rows; i++) {
for (j = 0; j < cols / 2; j++) {
t = arr[i][cols - 1 - j];
arr[i][cols - 1 - j] = arr[i][j];
arr[i][j] = t;
}
}
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++)
printf("%-5d", arr[i][j]);
printf("\n");
}
}
3.上下左右反转
#include <stdio.h>
void main() {
int arr[4][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
};
int i, j, t;
int rows = sizeof(arr) / sizeof(arr[0]);
int cols = sizeof(arr[0]) / sizeof(arr[0][0]);
/* 上下对称反转 */
for (i = 0; i < rows / 2; i++) {
for (j = 0; j < cols; j++) {
t = arr[rows - 1 - i][j];
arr[rows - 1 - i][j] = arr[i][j];
arr[i][j] = t;
}
}
/* 左右对称反转 */
for (i = 0; i < rows; i++) {
for (j = 0; j < cols / 2; j++) {
t = arr[i][cols - 1 - j];
arr[i][cols - 1 - j] = arr[i][j];
arr[i][j] = t;
}
}
/* 二维数组打印 */
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++)
printf("%-5d", arr[i][j]);
printf("\n");
}
}
4.判断a[N][N]是否关于主对角线对称(左斜),若对称输出1,否则输出0。
#include <stdio.h>
#define N 5
void main() {
int a[N][N], i, j, flag = 1;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < N; i++)
for (j = 0; j < i; j++)
if (a[i][j] != a[j][i]) {
flag = 0;
break;
}
if (flag == 1)
printf("1");
else
printf("0");
}
5.判断a[N][N]是否关于次对角线对称(右斜),若对称输出1,否则输出0。
#include <stdio.h>
#define N 5
void main() {
int a[N][N], i, j, flag = 1;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < N; i++)
for (j = 0; j < N - 1 - i; j++)
if (a[i][j] != a[N - 1 - j][N - 1 - i]) {
flag = 0;
break;
}
if (flag == 1)
printf("1");
else
printf("0");
}
6.分别求出N阶方阵a中两个对角线上元素之和。
#include <stdio.h>
#define N 5
void main() {
int a[N][N], i, j, k = N, pr1 = 0, pr2 = 0;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < N; i++) {
pr1 += a[i][i];
k = k - 1;
pr2 += a[i][k];
}
printf("pr1=%d\n", pr1);
printf("pr2=%d\n", pr2);
}
7.N阶方阵a进行转置,输出行列互换后的方阵a。
#include <stdio.h>
#define N 5
void main() {
int a[N][N], i, j, t;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < N; i++)
for (j = 0; j < i; j++) {
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%-5d", a[i][j]);
printf("\n");
}
}
8.N阶方阵a加上方阵a的转置存放在方阵b中,输出方阵b。
#include <stdio.h>
#define N 5
void main() {
int a[N][N], b[N][N], i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
b[i][j] = a[i][j] + a[j][i];
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%d ", b[i][j]);
printf("\n");
}
}
第四类、字符处理(15道)
1.编写函数:int cmp(char *str1,char *str2)
,实现字符串的比较。
#include <stdio.h>
int cmp(char *str1, char *str2) {
while (*str1 == *str2 && *str1 != '\0') {
str1++;
str2++;
}
return *str1 - *str2;
}
void main() {
char s1[100] = "ABCDEF1";
char s2[100] = "ABCDEF0";
printf("%d", cmp(s1, s2));
}
2.编写函数:void cpy(char *dest,char *src)
,实现字符串的拷贝。
#include <stdio.h>
void cpy(char *dest, char *src) {
while (*dest++ = *src++);
}
void main() {
char s1[100] = "AABCD123ABCD123ABCDA";
char s2[100] = "123";
cpy(s1, s2);
puts(s1);
}
3.编写函数:void cat(char *dest,char *src)
,实现字符串的追加。
#include <stdio.h>
void cat(char *dest, char *src) {
while (*dest++);
dest--;
while (*dest++ = *src++);
}
void main() {
char s1[100] = "AABCD123ABCD123ABCDA";
char s2[100] = "123";
cat(s1, s2);
puts(s1);
}
4.编写函数:void reverse(char *str)
,实现字符串的反转。
#include <stdio.h>
void reverse(char *str) {
char *start = str, *end = str, t;
while (*end++);
end -= 2;
while (start < end) {
t = *start;
*start++ = *end;
*end-- = t;
}
}
void main() {
char str[100] = "123456789";
reverse(str);
puts(str);
}
5.编写函数:int len(char *str)
,判断字符串的长度。
#include <stdio.h>
int len(char *str) {
char *p = str;
while (*str++);
return str - 1 - p;
}
void main() {
printf("%d", len("AABCD123ABCD123ABCDA"));
}
6.编写函数:int strchc(char *str, char c)
,实现统计str字符串中指定字符出现的个数。
#include <stdio.h>
int strchc(char *str, char c) {
int count = 0;
while (*str) {
if (*str == c) {
count++;
}
str++;
}
return count;
}
void main() {
printf("%d", strchc("AABCD123ABCD123ABCDA", 'A'));
}
7.编写函数:int strstrc(char *str, char *substr)
,实现统计str字符串中指定字符串出现的个数。
#include <stdio.h>
int strstrc(char *str, char *substr) {
int count = 0;
char *pb, *ps;
while (*str) {
pb = str;
ps = substr;
while (*ps) {
if (*pb == *ps) {
pb++;
ps++;
} else {
break;
}
}
if (*ps == '\0') {
count++;
}
str++;
}
return count;
}
void main() {
printf("%d", strstrc("AABCD123ABCD123ABCDA", "ABCD"));
}
8.编写函数:void delch(char *str, char c)
,实现删除str字符串中出现所有指定字符。
#include <stdio.h>
void delch(char *str, char c) {
char *p = str;
while (*str) {
if (*str != c) {
*p++ = *str;
}
str++;
}
*p = '\0';
}
void main() {
char s1[100] = "AABCD123ABCD123ABCDA";
char c = 'A';
delch(s1, c);
puts(s1);
}
9.编写函数:char *delstr(char *str, char *substr)
,实现删除str字符串中出现所有指定字符串。
#include <stdio.h>
#include <string.h>
char *delstr(char *str, char *substr) {
char *pb = str, *q, *c;
int n = strlen(substr);
while (q = strstr(pb, substr)) {
c = q + n;
*q = '\0';
pb = strcat(pb, c);
}
return pb;
}
void main() {
char s1[100] = "AABCD123ABCD123ABCDA";
char s2[100] = "ABCD";
delstr(s1, s2);
puts(s1);
}
10.编写函数:void repch(char *str, char subch, char repch)
,将str字符串中出现的所有字符subch替换为repch。
#include <stdio.h>
void repch(char *str, char subch, char repch) {
while (*str) {
if (*str == subch) {
*str = repch;
}
str++;
}
}
void main() {
char str[100] = "abcdefabcdefabcdef";
repch(str, 'a', 'A');
puts(str);
}
11.编写函数:void repstr(char *str, char *substr, char *repstr)
,将str字符串中出现的所有子串substr替换为repstr。
#include <stdio.h>
void repstr(char *str, char *substr, char *repstr) {
char *pb, *ps;
while (*str) {
pb = str;
ps = substr;
while (*ps) {
if (*pb == *ps) {
pb++;
ps++;
} else {
break;
}
}
if (*ps == '\0') {
ps = repstr;
while (*ps)
*str++ = *ps++;
} else {
str++;
}
}
}
void main() {
char str[100] = "abcdefabcdefabcdef";
repstr(str, "abc", "XYZ");
puts(str);
}
12.编写函数:char *strch(char *str, char c)
,如果指定字符是str字符串的元素,返回元素所在的首地址,否则,返回NULL。
#include <stdio.h>
char *strch(char *str, char c) {
while (*str) {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
void main() {
char s1[100] = "AABCD123ABCD123ABCDA";
char c = '1';
printf("%s", strch(s1, c));
}
13.编写函数:char *strstr(char *str, char *substr)
,如果指定字符串是str字符串的元素,返回元素所在的首地址,否则,返回NULL。
#include <stdio.h>
char *strstr(char *str, char *substr) {
char *pb, *ps;
while (*str) {
pb = str;
ps = substr;
while (*ps) {
if (*pb == *ps) {
pb++;
ps++;
} else {
break;
}
}
if (*ps == '\0') {
return str;
}
str++;
}
return NULL;
}
void main() {
char s1[100] = "AABCD123ABCD123ABCDA";
char s2[100] = "123";
printf("%s", strstr(s1, s2));
}
14.输入多个字符串,输出其中最长的第一个字符串。
#include <stdio.h>
#include <string.h>
void main() {
char str[100] = {0}, min[100] = {0};
printf("Please enter a string:\n");
gets(min);
if(strlen(min) != '\0') {
while (1) {
printf("Please enter a string:\n");
gets(str);
if (str[0] == '\0') {
break;
}
if (strlen(str) >= strlen(min)) {
strcpy(min, str);
}
}
printf("min=%s\n", min);
} else {
printf("No input string!");
}
}
15.输入多个字符串,输出其中最短的第一个字符串。
#include <stdio.h>
#include <string.h>
void main() {
char str[100] = {0}, min[100] = {0};
printf("Please enter a string:\n");
gets(min);
if(strlen(min) != '\0') {
while (1) {
printf("Please enter a string:\n");
gets(str);
if (str[0] == '\0') {
break;
}
if (strlen(str) <= strlen(min)) {
strcpy(min, str);
}
}
printf("min=%s\n", min);
} else {
printf("No input string!");
}
}
第五类、数学问题(15道)
1.鸡兔同笼:假设鸡兔共30只,脚88只,问鸡兔各有多少只?
#include <stdio.h>
void main() {
int i, j;
for (i = 0; i <= 30; i++) {
j = 30 - i;
if (2 * i + 4 * j == 88)
printf("%d,%d", i, j);
}
}
2.百钱百鸡:100元钱买100只鸡,公鸡5块钱一只,母鸡3块钱一只,小鸡一块钱3只,请输出所有组合。
#include <stdio.h>
void main() {
int a, b, c;
for (a = 0; a <= 20; a++) {
for (b = 0; b <= 33; b++) {
c = 100 - a - b;
if (a * 5 + b * 3 + c / 3 == 100 && c % 3 == 0)
printf("%d,%d,%d\n", a, b, c);
}
}
}
3.斐波那契数列:请用循环输出斐波那契数列的前20项。
#include <stdio.h>
void main() {
int i, a = 1, b = 1;
for (i = 1; i <= 10; i++) {
printf("%d,%d,", a, b);
a = a + b;
b = a + b;
}
}
4.兔子数列(又称斐波那契数列):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问前10个月,每个月有兔子多少对?
#include <stdio.h>
int fibonacci(int n) {
if (n == 1 || n == 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
void main() {
int i;
for (i = 1; i <= 10; i++) {
printf("the %d month has %d\n", i, fibonacci(i));
}
}
5.兔子数列(又称斐波那契数列):有一对兔子,从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,请问第一个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
#include <stdio.h>
int fibonacci(int n) {
if (n == 1 || n == 2)
return 1;
return fibonacci(n - 1) + fibonacci(n - 2);
}
void main() {
int m = 1, n, s = 0;
scanf("%d", &n);
while ((s = fibonacci(m)) < n) {
m++;
}
printf("到第%d个月,才有%d对兔子,已有%d对兔子\n", m, n, s);
}
6.数字组合:有1、2、3、4,四个数字,能组成多少个互不相同且无重复数字的三位数?
#include <stdio.h>
void main() {
int a, b, c;
for (a = 1; a < 5; a++)
for (b = 1; b < 5; b++)
for (c = 1; c < 5; c++)
if ((a != b) && (a != c) && (b != c))
printf("%d,%d,%d\n", a, b, c);
}
7.字母组合:有A、B、C、D,四个字母,能组成多少个互不相同且无重复三位组合?
#include <stdio.h>
void main() {
int a, b, c;
for (a = 65; a < 69; a++)
for (b = 65; b < 69; b++)
for (c = 65; c < 69; c++)
if ((a != b) && (a != c) && (b != c))
printf("%c,%c,%c\n", a, b, c);
}
8.比赛抽签:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单,有人向队员打听比赛的名单,a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
#include <stdio.h>
void main() {
char a, b, c;
for (a = 'x'; a <= 'z'; a++)
for (b = 'x'; b <= 'z'; b++)
for (c = 'x'; c <= 'z'; c++)
if (a != b && a != c && b != c)
if (a != 'x' && c != 'x' && c != 'z')
printf("order as a--%c\tb--%c\tc--%c\n",
a, b, c);
}
9.韩信点兵:韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。计算韩信至少有多少兵。
#include <stdio.h>
void main() {
int x;
for (x = 1;; x++) {
if (x % 5 == 1 && x % 6 == 5 && x % 7 == 4 && x % 11 == 10) {
printf("%d", x);
break;
}
}
}
10.爱因斯坦:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。计算这条阶梯共有多少阶。
#include <stdio.h>
void main() {
int x;
for (x = 1;; x++) {
if (x%2==1 && x%3==2 && x%5==4 && x%6==5 && x%7==0) {
printf("%d", x);
break;
}
}
}
11.哥德巴赫猜想:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数,请编写程序验证。
#include <stdio.h>
int isPrime(long p) {
long i;
for (i = 2; i < p; i++)
if (p % i == 0)
return 0;
return 1;
}
void main() {
long n, p1, p2;
scanf("%ld", &n);
for (p1 = 3; p1 <= n / 2; p1 += 2) {
p2 = n - p1;
if (isPrime(p1) && isPrime(p2)) {
printf("%ld=%ld+%ld\n", n, p1, p2);
break;
}
}
}
12.分解质因数:每个合数(非质数)都可以写成几个质数相乘的形式,这几个质数就叫做这个合数的质因数。比如,24可以被分解为2 2 2 3。请输入一个合数,输出它的质因数。
#include <stdio.h>
void main() {
int n, i;
scanf("%d", &n);
while (n != 1) {
for (i = 2; i <= n; i++) {
if (n % i == 0) {
printf("%d ", i);
n = n / i;
break;
}
}
}
}
13.一元二次方程:求一元二次方程〖ax〗^2+bx+c=0的解(a、b、c为任意实数)。
#include <stdio.h>
#include <math.h>
void main() {
double a, b, c, disc, x1, x2, realpart, imagpart;
scanf("%lf%lf%lf", &a, &b, &c);
printf("The equation ");
if (fabs(a) <= 1e-6)
printf("is not a quadratic");
else {
disc = b * b - 4 * a * c;
if (fabs(disc) <= 1e-6)
printf("has two equal roots:%8.4f", -b / (2 * a));
else if (disc > 1e-6) {
x1 = (-b + sqrt(disc)) / (2 * a);
x2 = (-b - sqrt(disc)) / (2 * a);
printf("has two differ roots:%8.4f and %8.4f", x1, x2);
} else {
realpart = -b / (2 * a);
imagpart = sqrt(-disc) / (2 * a);
printf("has complex roots:\n");
printf("%8.4f+%8.4fi\n", realpart, imagpart);
printf("%8.4f-%8.4fi\n", realpart, imagpart);
}
}
}
14.三角形的周长和面积:给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),编写程序检验它们能否构成三角形。若这三个点不能构成三角形,则输出“Impossible”;若可以,则输出该三角形的周长和面积。
#include <stdio.h>
#include <math.h>
void main() {
float x1, x2, x3, y1, y2, y3;
float a, b, c, s, l, area;
scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3);
a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
c = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
if (a + b > c && a + c > b && b + c > a) {
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));
l = a + b + c;
printf("L = %.2f, A = %.2f\n", l, area);
} else {
printf("Impossible\n");
}
}
15.圆的周长和面积:输入圆的半径,输出圆的周长和面积。Π=3.14
#include <stdio.h>
void main() {
float r, l, area;
scanf("%f", &r);
l = 2 * 3.14 * r;
area = 3.14 * r * r;
printf("L = %.2f, A = %.2f\n", l, area);
}
第六类、排序算法(04道)
1.冒泡排序法。
#include <stdio.h>
void bubble_sort(int arr[], int len) {
int i, j, t;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
void main() {
int arr[] = {11, 99, 22, 88, 33, 77, 44, 66, 55, 55}, i;
bubble_sort(arr, 10);
for (i = 0; i < 10; i++) {
printf("%-4d", arr[i]);
}
}
2.选择排序法。
第一种:高效率。
#include <stdio.h>
void selction_sort(int arr[], int len) {
int i, j, t, min;
for (i = 0; i < len - 1; i++) {
min = i;
for (j = i + 1; j < len; j++) {
if (arr[min] > arr[j])
min = j;
}
if (min != i) {
t = arr[min];
arr[min] = arr[i];
arr[i] = t;
}
}
}
void main() {
int arr[] = {11, 99, 22, 88, 33, 77, 44, 66, 55, 55}, i;
selction_sort(arr, 10);
for (i = 0; i < 10; i++) {
printf("%-4d", arr[i]);
}
}
第二种:低效率。
#include <stdio.h>
void selction_sort(int arr[], int len) {
int i, j, t;
for (i = 0; i < len - 1; i++) {
for (j = i + 1; j < len; j++) {
if (arr[i] > arr[j]) {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
}
}
void main() {
int arr[] = {11, 99, 22, 88, 33, 77, 44, 66, 55, 55}, i;
selction_sort(arr, 10);
for (i = 0; i < 10; i++) {
printf("%-4d", arr[i]);
}
}
3.插入排序法。
#include <stdio.h>
void insertion_sort(int arr[], int len) {
int i, j, t;
for (i = 0; i < len - 1; i++) {
for (j = i + 1; j > 0; j--) {
if (arr[j - 1] > arr[j]) {
t = arr[j - 1];
arr[j - 1] = arr[j];
arr[j] = t;
} else {
break;
}
}
}
}
void main() {
int arr[] = {11, 99, 22, 88, 33, 77, 44, 66, 55, 55}, i;
insertion_sort(arr, 10);
for (i = 0; i < 10; i++) {
printf("%-4d", arr[i]);
}
}
4.字符串排序。
#include <stdio.h>
#include <string.h>
#define N 4
void main() {
int i, j;
char s[N][100], t[100];
for (i = 0; i < N; i++)
gets(s[i]);
for (i = 0; i < N - 1; i++)
for (j = 0; j < N - 1 - i; j++)
if (strcmp(s[j], s[j + 1]) > 0) {
strcpy(t, s[j]);
strcpy(s[j], s[j + 1]);
strcpy(s[j + 1], t);
}
for (i = 0; i < N; i++)
puts(s[i]);
}
第七类、循环问题(17道)
1.求总和:1+2+3+4+5+…+100。
#include <stdio.h>
void main() {
int i, sum = 0;
for (i = 1; i <= 100; i++)
sum += i;
printf("%d", sum);
}
2.求总和:-1+2-3+4-5+…+100。
#include <stdio.h>
void main() {
int i, sum = 0;
for (i = 1; i <= 100; i++) {
if (i % 2 == 1)
sum -= i;
else
sum += i;
}
printf("%d", sum);
}
3.求总和:1-2+3-4+5-…-100。
#include <stdio.h>
void main() {
int i, sum = 0;
for (i = 1; i <= 100; i++) {
if (i % 2 == 0)
sum -= i;
else
sum += i;
}
printf("%d", sum);
}
4.求总和:11+22+33+44+55+66+77+88+99。
#include <stdio.h>
void main() {
int i, sum = 0;
for (i = 1; i <= 9; i++)
sum += (i * 10 + i);
printf("%d", sum);
}
5.求总和:s=a+aa+aaa+…+aaa(n个a)。输入a表示基数,输入n表示项数。
#include <stdio.h>
void main() {
int a, n, i, t = 0, sum = 0;
scanf("%d%d", &a, &n);
for (i = 1; i <= n; i++) {
t = t * 10 + a;
sum += t;
}
printf("%d", sum);
}
6.求总和:1-100以内所有奇数的和。
#include <stdio.h>
void main() {
int i, sum = 0;
for (i = 1; i <= 100; i += 2)
sum += i;
printf("%d", sum);
}
7.求总和:1-100以内所有偶数的和。
#include <stdio.h>
void main() {
int i, sum = 0;
for (i = 2; i <= 100; i += 2)
sum += i;
printf("%d", sum);
}
8.递归求和:1!+2!+3!+4!+5!+6!+7!+8!+9!+10!。
#include <stdio.h>
void main() {
int i, n = 1, sum = 0;
for (i = 1; i <= 10; i++) {
n *= i;
sum += n;
}
printf("%d", sum);
}
9.斐波那契数列求和:1+1+2+3+5+8+…+6765。
#include <stdio.h>
void main() {
int i, a = 1, b = 1, sum = 0;
for (i = 1;; i++) {
sum += (a + b);
if (b == 6765)
break;
a = a + b;
b = a + b;
}
printf("%d", sum);
}
10.分数求和:1-1/3+1/5-1/7+…-1/99+1/101。
#include <stdio.h>
void main() {
int i, t = 1;
float n, sum = 0;
for (i = 1; i <= 101; i += 2) {
n = (1.0 / i) * t;
sum += n;
t = -t;
}
printf("%.2f", sum);
}
11.求Π的值:根据以下公式求Π的近似值,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
void main() {
double fz = 1, fm = 3, s = 1, i = 1;
while (fabs(fz / fm) >= 1e-6) {
/*累加当前项*/
s += (fz / fm);
/*准备下一项*/
fz *= (++i);
fm *= 2 * i + 1;
}
printf("%.2lf", s * 2);
}
12.求Π的值:根据以下公式求Π的近似值,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
void main() {
double fz = 1, fm = 1, s = 0, t = 1;
while (fabs(fz / fm * t) >= 1e-6) {
/*累加当前项*/
s += (fz / fm * t);
/*准备下一项*/
fm += 2;
/*改变符号值*/
t = -t;
}
printf("%.2lf", s * 4);
}
13.求e的值:根据以下公式求e的近似值,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
void main() {
double fz = 1, fm = 1, s = 1, i = 1;
while (fabs(fz / fm) >= 1e-6) {
/*累加当前项*/
s += (fz / fm);
/*准备下一项*/
fm *= (++i);
}
printf("%.2lf", s);
}
14.求ex的值:根据以下公式求ex的近似值,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
void main() {
double fz, fm, s = 1, i = 1, x;
scanf("%lf", &x);
fz = x;
fm = 1;
while (fabs(fz / fm) >= 1e-6) {
/*累加当前项*/
s += (fz / fm);
/*准备下一项*/
fz = pow(x, ++i);
fm *= i;
}
printf("%.2lf", s);
}
15.求sinx的值:根据以下公式求sinx的近似值,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
void main() {
double x, t, s = 0;
int i = 0;
scanf("%lf", &x);
t = x;
while (fabs(t) >= 1e-6) {
s += t;
i++;
t *= -1 * (x * x) / (2 * i) / (2 * i + 1);
}
printf("%.2lf", s);
}
16.求cosx的值:根据以下公式求cosx的近似值,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
void main() {
double x, t, s = 0;
int i = 0;
scanf("%lf", &x);
t = 1;
while (fabs(t) >= 1e-6) {
s += t;
i++;
t *= -1 * (x * x )/ (2 * i) / (2 * i - 1);
}
printf("%.2lf", s);
}
17.求平方根:编写函数double getsqrt(double a),计算x=√a(只计算a=1,2,3,4,5的值)。已知计算x=√a的迭代公式如下所示,要求累加到某项的绝对值小于1e-6时为止。
#include <stdio.h>
#include <math.h>
double getsqrt(double a) {
double x0, x1;
x0 = a / 2;
x1 = (x0 + a / x0) / 2;
while (fabs(x0 - x1) >= 1e-6) {
x0 = x1;
x1 = (x0 + a / x0) / 2;
}
return x0;
}
void main() {
int i;
for (i = 1; i <= 5; i++) {
printf("%.2lf\n", getsqrt(i));
}
}
第八类、进制转换(05道)
1.十进制(0~2147483647)转任意进制(2进制~16进制)。
#include <stdio.h>
void main() {
int num, radix, i = 0;
char res[32] = {0}, table[] = "0123456789ABCDEF";
printf("请输入一个十进制整数:");
scanf("%d", &num);
printf("请输入要转换为几进制:");
scanf("%d", &radix);
if (num == 0) {
res[0] = '0';
i = 1;
}
while (num > 0) {
res[i++] = table[num % radix];
num /= radix;
}
printf("转换结果:");
while (--i >= 0) {
printf("%c", res[i]);
}
}
2.任意进制(2进制~16进制)转十进制(0~2147483647)。
#include <stdio.h>
#include <string.h>
void main() {
int res = 0, radix, i, k = 1;
char num[32], table[] = "0123456789ABCDEF";
printf("请输入待转换的字符串:");
scanf("%s", &num);
printf("待转换字符串为几进制:");
scanf("%d", &radix);
for (i = strlen(num) - 1; i >= 0; i--) {
res += (strchr(table, num[i]) - table) * k;
k *= radix;
}
printf("转换结果:%d", res);
}
3.输入一个二进制字符串,将其转换为对应的十进制。
#include <stdio.h>
void main() {
char s[10];
int i, n;
gets(s);
for (n = i = 0; s[i] != '\0'; i++) {
n = n * 2 + s[i] - '0';
}
printf("%d", n);
}
4.输入一个八进制字符串,将其转换为对应的十进制。
#include <stdio.h>
void main() {
char s[10];
int i, n;
gets(s);
for (n = i = 0; s[i] != '\0'; i++) {
n = n * 8 + s[i] - '0';
}
printf("%d", n);
}
5.输入一个十六进制字符串,将其转换为对应的十进制。
#include <stdio.h>
void main() {
char s[10];
int i, n;
gets(s);
for (n = i = 0; s[i] != '\0'; i++) {
if (s[i] >= '0' && s[i] <= '9')
n = n * 16 + s[i] - '0';
if (s[i] >= 'a' && s[i] <= 'z')
n = n * 16 + s[i] - 'a' + 10;
if (s[i] >= 'A' && s[i] <= 'Z')
n = n * 16 + s[i] - 'A' + 10;
}
printf("%d", n);
}
第九类、实际应用(27道)
1.自由落体:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
#include <stdio.h>
void main() {
double s = 100, h = s / 2;
int i;
for (i = 2; i <= 10; i++) {
s = s + 2 * h;
h = h / 2;
}
printf("s=%.6lf\n", s);
printf("h=%.6lf\n", h);
}
2.计算天数:输入年月日,求当天是那年的第几天?
#include <stdio.h>
void main() {
int y, m, d, s, i;
scanf("%d%d%d", &y, &m, &d);
s = d;
for (i = 1; i < m; i++)
if (i==1||i==3||i==5||i==7||i==8||i==10||i==12)
s += 31;
else if (i==4||i==6||i==9||i==11)
s += 30;
else if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
s += 29;
else
s += 28;
printf("%d", s);
}
3.奖金提成:企业发放的奖金根据利润提成:
00万元 < 利润 <= 10 万元,高出00万元的部分,奖金可提成10%;
10万元 < 利润 <= 20 万元,高出10万元的部分,奖金可提成7.5%;
20万元 < 利润 <= 40 万元,高出20万元的部分,奖金可提成5%;
40万元 < 利润 <= 60 万元,高出40万元的部分,奖金可提成3%;
60万元 < 利润 <= 100万元,高出60万元的部分,奖金可提成1%;
100万元< 利润 ,高出100万的部分,奖金可提成1%;
从键盘输入当月利润n,求应发放奖金总数?
#include <stdio.h>
void main() {
double n,bonus,bonus10,bonus20,bonus40,bonus60,bonus100;
printf("Please enter the total profit of the month:");
scanf("%lf", &n);
bonus10 = 100000 * 0.1;
bonus20 = bonus10 + 100000 * 0.075;
bonus40 = bonus20 + 200000 * 0.05;
bonus60 = bonus40 + 200000 * 0.03;
bonus100 = bonus60 + 400000 * 0.015;
if (n <= 100000)
bonus = n * 0.1;
else if (n <= 200000)
bonus = bonus10 + (n - 100000) * 0.075;
else if (n <= 400000)
bonus = bonus20 + (n - 200000) * 0.05;
else if (n <= 600000)
bonus = bonus40 + (n - 400000) * 0.03;
else if (n <= 1000000)
bonus = bonus60 + (n - 600000) * 0.015;
else if (n > 1000000)
bonus = bonus100 + (n - 1000000) * 0.01;
printf("bonus=%lf", bonus);
}
4.出租车计价:根据某城市普通出租车收费标准编写程序计算车费,标准如下:起步里程为3公里,起步费10元;超起步里程后10公里内,每公里2元;超过10公里以上的部分加收50%的回空补贴费,即每公里3元;营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。输入在一行中,给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(单位为分钟),其间以空格分隔。输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
#include <stdio.h>
void main() {
double mile;
int time;
double price, price1, price2;
scanf("%lf%d", &mile, &time);
if (mile <= 3) {
price1 = 10;
} else if (mile <= 10) {
price1 = 10 + (mile - 3) * 2.0;
} else {
price1 = 10 + (10 - 3) * 2.0 + (mile - 10) * 3.0;
}
price2 = time / 5 * 2;
price = price1 + price2;
printf("%.0f", price);
}
5.阶梯电价:为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。输入某用户的月用电量(单位:千瓦时),计算该用户应支付的电费(元),结果保留两位小数。
#include <stdio.h>
void main() {
float ydl, df;
scanf("%f", &ydl);
if (ydl <= 50)
df = 0.53 * ydl;
else
df = 0.53 * 50 + (ydl - 50) * 0.58;
printf("%.2f", df);
}
6.学生成绩分布:读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:大于等于90分为A;小于90且大于等于80为B;小于80且大于等于70为C;小于70且大于等于60为D;小于60为E。输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
#include <stdio.h>
void main() {
int a, b, c, d, e, n, i, arr[1000] = {0};
scanf("%d", &n);
a = b = c = d = e = 0;
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
if (arr[i] >= 90)
a++;
else if (arr[i] >= 80)
b++;
else if (arr[i] >= 70)
c++;
else if (arr[i] >= 60)
d++;
else
e++;
}
printf("%d %d %d %d %d", a, b, c, d, e);
}
7.问星期:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
#include <stdio.h>
void main() {
char w;
printf("请输入第一个字母:");
scanf("%c", &w);
getchar();
switch (w) {
case 'M' :printf("周一");break;
case 'W' :printf("周三");break;
case 'F' :printf("周五");break;
case 'S' :
printf("请输入第二个字母:");
scanf("%c", &w);
switch (w) {
case 'u' :printf("周日");break;
case 'a' :printf("周六");break;
}
break;
case 'T' :
printf("请输入第二个字母:");
scanf("%c", &w);
switch (w) {
case 'u' :printf("周二");break;
case 'h' :printf("周四");break;
}
break;
}
}
8.字符统计:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include <stdio.h>
void main() {
int letters = 0, spaces = 0, digits = 0, others = 0;
char c;
while ((c = getchar()) != '\n') {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
letters++;
else if (c == ' ')
spaces++;
else if (c >= '0' && c <= '9')
digits++;
else
others++;
}
printf("l=%d,d=%d,s=%d,o=%d", letters, digits, spaces, others);
}
9.报数问题:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include <stdio.h>
void main() {
int a[1000], n, t, c, i;
scanf("%d", &n);
t = n;
for (i = 0; i < t; i++) {
a[i] = i + 1;
}
for (i = c = 0; n > 1; i++) {
/* 从头开始吗 */
if (i == t) {
i = 0;
}
/* 退圈的不管 */
if (a[i] != 0) {
c++;
}
/* 数到三退圈 */
if (c == 3) {
a[i] = 0;
c = 0;
n--;
}
}
for (i = 0; i < t; i++) {
if (a[i] != 0) {
printf("%d", a[i]);
}
}
}
10.数据加密:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。然后按照相反的顺序依次输出。
#include <stdio.h>
#define N 4
void main() {
int a, i, t, data[N];
scanf("%d", &a);
data[0] = a % 10;
data[1] = a / 10 % 10;
data[2] = a / 100 % 10;
data[3] = a / 1000;
for (i = 0; i < N; i++) {
data[i] += 5;
data[i] %= 10;
}
for (i = 0; i < N / 2; i++) {
t = data[i];
data[i] = data[N - 1 - i];
data[N - 1 - i] = t;
}
for (i = 0; i < N; i++) {
printf("%d", data[N - 1 - i]);
}
}
11.一维数组:输入n个(1<n<=10)正整数并保存到数组中,求出最大值、最小值、平均值以及最大值、最小值在数组中的下标分别是多少。
#include <stdio.h>
void main() {
int i, n, max = 0, min = 0, sum = 0, a[10];
float avg;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
avg = (float) sum / n;
for (i = 0; i < n; i++) {
if (a[i] > a[max])
max = i;
if (a[i] < a[min])
min = i;
}
printf("max=%d,index=%d\n", a[max], max);
printf("min=%d,index=%d\n", a[min], min);
printf("avg=%.2f\n", avg);
}
12.字符加密:编写加密函数:int encode(int *c)
、解密函数:int decode(int *c)
,主函数输入一些纯字符,调用加密算法对这些字符进行加密,加密方式:每个字符的码值+13,然后再调用解密函数将加密后的字符依次输出。
#include <stdio.h>
/* 加密算法 */
int encode(int *c) {
*c = *c + 13;
return *c;
}
/* 解密算法 */
int decode(int *c) {
*c = *c - 13;
return *c;
}
void main() {
int c[100], i;
i = 0;
while ((c[i] = getchar()) != '\n') {
putchar(encode(&c[i]));
i++;
}
printf("\n");
i = 0;
while (c[i] != '\n') {
putchar(decode(&c[i]));
i++;
}
printf("\n");
}
13.数字提取:输入一个以回车为结束标志的字符串(少于10个字符),提取其中的所有数字字符,将其转换成一个十进制整数输出。
#include <stdio.h>
void main() {
char str[10];
int i = 0, n = 0;
gets(str);
while (str[i] != '\0') {
if (str[i] >= '0' && str[i] <= '9') {
n = n * 10 + str[i] - '0';
}
i++;
}
printf("num=%d\n", n);
}
14.渔民打鱼:中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后得第N天中是“打鱼”还是“晒网”?
#include <stdio.h>
void main() {
int day;
scanf("%d", &day);
if (day % 5 == 1 || day % 5 == 2 || day % 5 == 3) {
printf("Fishing in day %d\n", day);
} else {
printf("Drying in day %d\n", day);
}
}
15.小球重量:三个球A、B、C,大小形状相同且其中一个球与其它球重量不同,要求找出这个不一样的球。
#include <stdio.h>
void main() {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (a == b)
printf("C\n");
else if (a == c)
printf("B\n");
else
printf("A\n");
}
16.学生捐款:在全校1000名学生中,征集慈善募捐,当募捐总数达到10万元时就停止募捐,统计此时的捐款人数以及平均每人捐款的数目。
#include <stdio.h>
void main() {
float amount, avg, sum = 0;
int i;
for (i = 1; i <= 1000; i++) {
printf("请输入捐款金额:");
scanf("%f", &amount);
sum = sum + amount;
if (sum >= 100000) {
break;
}
}
if (i <= 1000) {
printf("募捐已经完成,信息如下:\n");
avg = sum / i;
} else {
printf("募捐没有完成,信息如下:\n");
avg = sum / (--i);
}
printf("捐款人数=%d,平均金额=%.2f\n", i, avg);
}
17.递归转换:用递归的方法将一个整数转换为字符串。例如:输入123456,输出“123456”。
#include <stdio.h>
void tranvers(int n) {
if (n / 10 != 0)
tranvers(n / 10);
printf("%c", n % 10 + '0');
}
void main() {
int n;
printf("Please enter a number:");
scanf("%d", &n);
printf("The string is ");
if (n < 0) {
printf("-");
n = -n;
}
tranvers(n);
}
18.火车时间:假设出发和到达在同一天内,根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。输入格式:在一行中输入两个4位正整数,分别表示火车的出发时间和到达时间,每个时间的格式为2位小时数(00-23)和2位分钟数(00-59)。输出格式:“hh:mm”,其中hh为2位小时数、mm为2位分钟数。
#include <stdio.h>
void main() {
int ks, js, xs, fz;
scanf("%d%d", &ks, &js);
xs = js / 100 - ks / 100;
fz = js % 100 - ks % 100;
if (fz < 0) {
xs = xs - 1;
fz = 60 + fz;
}
printf("%02d:%02d", xs, fz);
}
19.简单计算器:编写一个简单计算器的程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算,且保证除法和求余的分母非零。当运算符为+、-、*、/、%时,输出相应的运算结果。若输入是非法符号则输出ERROR。
#include <stdio.h>
void main() {
int a, b;
char c;
scanf("%d %c%d", &a, &c, &b);
switch (c) {
case '+': printf("%d\n", a + b); break;
case '-': printf("%d\n", a - b); break;
case '*': printf("%d\n", a * b); break;
case '/':
if (b != 0) {
printf("%d\n", a / b);
break;
}
case '%':
if (b != 0) {
printf("%d\n", a % b);
break;
}
default :
printf("ERROR\n");
break;
}
}
20.机动车处理:按照规定,在高速公路上行驶的机动车,达到或超出本车道限速的10%,则初200元罚款;达到或超出本车道限速的50%,就要吊销驾驶证。编写程序根据车速和限速自定判别对该机动车的处理。输入两个整数,分别对应车速和限速。输出格式:若属于正常驾驶,则输出“OK”;若属于罚款,则输出“Exceed x%. Ticket 200”;若应该吊销驾驶证,则输出“Exceed x%. License Revoked”。其中,x是超速的百分比,精确到整数。
#include <stdio.h>
void main() {
int cs, xs, n, m;
scanf("%d%d", &cs, &xs);
n = xs * (1 + 0.1);
m = xs * (1 + 0.5);
if (cs < n) {
printf("OK\n");
} else if (cs < m) {
printf("Exceed %.0f%%. Ticket 200\n",
1.0 * (cs - xs) / xs * 100);
} else {
printf("Exceed %.0f%%. License Revoked\n",
1.0 * (cs - xs) / xs * 100);
}
}
21.阶梯水费:为鼓励居民节约用水,自来水公司按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x-17。请编写程序实现水费的计算。
#include <stdio.h>
void main() {
float x, y;
scanf("%f", &x);
if (x >= 0 && x <= 15)
y = 4 * x / 3;
else
y = 2.5 * x - 17;
printf("%.2f\n", y);
}
22.蠕虫爬井:一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。问蠕虫需要多长时间才能爬出井?要求不足1分钟按1分钟计算,假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。输入格式:输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100但必须大于0。输出格式:在一行中输出蠕虫爬出井的时间,以分钟为单位。
#include <stdio.h>
void main() {
int n, u, d, time = 0, curh = 0;
/* 输入井的深度,蠕虫上爬和下滑的距离 */
scanf("%d%d%d", &n, &u, &d);
while (1) {
time++;
curh += u; /* 每爬一次,上升 u 距离 */
if (curh >= n) break;
time++;
curh -= d; /* 休息一次,下滑 d 距离 */
}
printf("%d\n", time);
}
23.汽油自助服务:现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m – 自助,e – 协助),计算并输出相应付款。
#include <stdio.h>
void main() {
float je, jg;
int a, b;
char c;
scanf("%d %d %c", &a, &b, &c);
switch (b) {
case 90:
jg = 6.95;
break;
case 93:
jg = 7.44;
break;
case 97:
jg = 7.93;
break;
}
if (c == 'm') {
je = jg * a * (1 - 0.05);
} else {
je = jg * a * (1 - 0.03);
}
printf("%.2f", je);
}
24.四舍五入:编程实现将浮点数“123.456789”分别四舍五入保留1位小数、2位小数和3位小数。
#include <stdio.h>
void main() {
float a = 123.456789;
float f1 = (int) ((a * 10) + 0.5) / 10.0; //保留1位小数
float f2 = (int) ((a * 100) + 0.5) / 100.0; //保留2位小数
float f3 = (int) ((a * 1000) + 0.5) / 1000.0;//保留3位小数
printf("f1 = %0.1f\n", f1);
printf("f2 = %0.2f\n", f2);
printf("f3 = %0.3f\n", f3);
}
25.节目调查:调查电视节目受欢迎程度。某电视台要调查观众对该台8个栏目(设相应栏目编号为1-8)的受欢迎程度,共调查了1000位观众。现要求编写程序,输入每一位观众的投票情况(每位观众只能选择一个最喜欢的栏目投票),统计输出各栏目的得票情况。
#include <stdio.h>
void main() {
int i, n, a[9] = {0};
for (i = 1; i <= 1000; i++) {
scanf("%d", &n);
a[n]++;
}
for (i = 1; i <= 8; i++) {
printf("栏目%d得票=%d\n", i, a[i]);
}
}
26.由用户输入一个正整数n,分析出该正整数的每一位,然后将各位数字从大到小重新排序后得到正整数m,输出m和n的平均值。
(1)编写输出正整数n和m的程序。
(2)给出调试过的输出m和n的平均值的源程序。
#include <stdio.h>
#include <stdlib.h>
/**
* 选择排序法
* @param a 排序数组
* @param len 元素个数
*/
void selction_sort(int a[], int len) {
int i, j, t;
for (i = 0; i < len - 1; i++) {
for (j = i + 1; j < len; j++) {
if (a[i] < a[j]) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
void main() {
int m, n, t, i, c, *p;
/*输入数字n*/
scanf("%d", &n);
/*分析位数c*/
t = n;
c = 0;
while (t > 0) {
c++;
t /= 10;
}
/*分解数字n*/
p = (int *) malloc(sizeof(int) * c);
for (t = n, i = 0; i < c; i++) {
p[i] = t % 10;
t /= 10;
}
/*排序数组p*/
selction_sort(p, c);
/*数组还原m*/
for (m = 0, i = 0; i < c; i++) {
m = m * 10 + p[i];
}
/*输出结果*/
printf("n = %d\n", n);
printf("m = %d\n", m);
printf("(m + n) / 2 = %.2lf", ((m + n) / 2.0));
}
27.现有扑克牌52张,其花色记录为:char suit[4][5] = {“红心”, “方块”, “梅花”, “黑桃”};其牌面记录为:char face[] = {‘A’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘X’, ‘J’, ‘Q’, ‘K’};请用C语言编写程序实现以下功能。
(1)自定义结构体数组,按照同一花色牌面从小到大顺序记录全部52张扑克牌。
(2)以时间为参数设置随机序列种子,实现洗牌:即遍历扑克牌数组,依次交换当前牌与数组中随机位置的牌。
(3)输出打乱顺序后的全部扑克牌,牌与牌间使用Tab分隔。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct card {
int type;/*代表花色下标*/
int point;/*代表点数下标*/
} Card;
void main() {
int i, j, k, index;
Card c[52], t;
char suit[4][5] = {"红心", "方块", "梅花", "黑桃"};
char face[] = {'A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'J', 'Q', 'K'};
/*初始化52张牌,由k控制这是第几张牌*/
k = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 13; j++) {
c[k].type = i;
c[k].point = j;
k++;
}
}
/*循环这52张牌,使用随机数进行洗牌*/
srand(time(NULL));
for (i = 0; i < 52; i++) {
/*产生0~51的随机数*/
index = rand() % 52;
/*交换两张牌的位置*/
t = c[i];
c[i] = c[index];
c[index] = t;
}
/*输出这52张牌,由k控制这是第几张牌*/
k = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < 13; j++) {
printf("%s%c\t", suit[c[k].type], face[c[k].point]);
k++;
if (k % 13 == 0) {
printf("\n");
}
}
}
}
第十类、图形输出(09道)
1.左上三角
#include <stdio.h>
void main() {
int i, j;
for (i = 10; i >= 1; i--) {
for (j = 1; j <= i; j++)
printf("*");
if (i != 1)
printf("\n");
}
}
2.左下三角
#include <stdio.h>
void main() {
int i, j;
for (i = 1; i <= 10; i++) {
for (j = 1; j <= i; j++)
printf("*");
if (i != 10)
printf("\n");
}
}
3.右上三角
#include <stdio.h>
void main() {
int i, j;
for (i = 10; i >= 1; i--) {
for (j = 1; j <= 10 - i; j++)
printf(" ");
for (j = 1; j <= i; j++)
printf("*");
if (i != 1)
printf("\n");
}
}
4.右下三角
#include <stdio.h>
void main() {
int i, j;
for (i = 1; i <= 10; i++) {
for (j = 1; j <= 10 - i; j++)
printf(" ");
for (j = 1; j <= i; j++)
printf("*");
if (i != 10)
printf("\n");
}
}
5.输出杨辉三角形
#include <stdio.h>
void main() {
int i, j, n, a[100][100] = {0};
scanf("%d", &n);
for (i = 0; i < n; i++) {
a[i][0] = 1;
}
for (i = 1; i < n; i++) {
for (j = 1; j <= i; j++) {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
for (i = 0; i < n; i++) {
for (j = 0; j <= i; j++) {
printf("%-4d", a[i][j]);
}
printf("\n");
}
}
6.输出数字金字塔
#include <stdio.h>
void main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 9; j > i; j--)
printf(" ");
for (j = 1; j <= i; j++)
printf("%c", 48 + j);
for (j = i - 1; j >= 1; j--)
printf("%c", 48 + j);
if (i != 9)
printf("\n");
}
}
7.打印乘法口诀表。
#include <stdio.h>
void main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++)
printf("%d * %d = %-5d", i, j, i * j);
if (i != 9)
printf("\n");
}
}
8.输出空心菱形
#include <stdio.h>
void main() {
/*n:代表菱形边长*/
int i, j, n = 5;
/*打印上三角*/
for (i = 1; i <= n; i++) {
for (j = 1; j <= (2 * n - 1); j++) {
if (j == n + 1 - i || j == n - 1 + i)
printf("*");
else
printf(" ");
}
printf("\n");
}
/*打印下三角*/
for (i = 1; i < n; i++) {
for (j = 1; j <= (2 * n - 1); j++) {
if (j == i + 1 || j == (2 * n - 1) - i)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
9.输出实心菱形
#include <stdio.h>
void main() {
/*n:代表菱形边长*/
int i, j, n = 5;
/*打印上三角*/
for (i = 1; i <= n; i++) {
for (j = 1; j <= (2 * n - 1); j++) {
if (j >= n + 1 - i && j <= n - 1 + i)
printf("*");
else
printf(" ");
}
printf("\n");
}
/*打印下三角*/
for (i = 1; i < n; i++) {
for (j = 1; j <= (2 * n - 1); j++) {
if (j >= i + 1 && j <= (2 * n - 1) - i)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
声明:本文系转载文章,仅供学习交流使用,侵权请联系删除