文章目录
- ==所有题目均个人手动整理,如有错误,请指正==
- 第一章
- 第二章
- 2. 求三个数中的较大值(用函数)(p14、p107)
- 3.求1×2×3...×n(求n的阶乘,用for循环与while循环)(P17)
- 4.有M个学生,输出成绩在80分以上的学生的学号和成绩,并统计人数(p18)
- 5.判断200-2500的每一年是否是闰年,并将结果输出。非闰年如何求呢?(p18)
- 6.求1-1/2+1/3-1/4.....+1/99-1/100(有坑!p19)
- 7.判断素数(p20)
- 8.分解一个数的质因数
- 9.输入10个数,从中找最大(p35)
- 10.有三个数a,b,c,按大小顺序输出(使用函数p35)
- 11.判断一个数能否被3和5整除(p35)
- 12.求两个数m和n的最大公约数,以及最小公倍数(p35、p137)
- 13.求方程ax^2+bx+c=0的根(p35)
- 第三章
- 第四章
- 第五章
- 25.求1-100的和
- 26.学校1000名学生捐款,总数到达10万元结束,统计捐款人数及平均捐款数目(P122)
- 27.输出100-200不能被3整除的数(p123)
- 28.输出下列矩阵(p125)
- 29.用公式 π/4≈1-1/3+1/5-1/7+......求π的近似值,直达发现某一项的绝对值小于10^-6^为止。(p127)
- 30求100-200之间的全部素数
- 31.求斐波那契数列得前40 个数(p129)
- 32.统计输入的一行中字母、空格、数字和其它字符的个数(p137)
- 33求a+aa+aaa+aaaa+aaaaa....nn...nn的值,n表示a的位数,a是一个数字,二者都由键盘输入(p137)
- 34. 1!+2!+3!+4!+5!...+n!(p137)
- 方法1:双层for
- 方法2:单层循环
- 35.求1000以内的水仙花数,例:153 = 1^3^ + 5^3^ + 3^3^(p137)
- 36.求1000以内的完美数(一个数恰好等于其真因子之和)例:6 = 1+2+3
- 37.求一个分数序列的前20项和(p138)
- 38.自由落体(p138)
- 39.猴子吃桃
- 40.智能打印菱形
- 41.乒乓球比赛
- 第六章
- 42.冒泡排序(p144)
- 43.选择排序
- 44.插入排序
- 45.逆置矩阵(p149)
- 46.输出一个矩阵中的最大值,以及它的下标(p150)
- 47.统计单词的个数(p163)
- 48.三个字符串,找出最大者(p164)
- 49.筛选法求素数(p165)
- 50.求矩阵对角线之和(p165)
- 51.打印如下矩阵
- 52.向一个有序数组中插入一个数,按顺序输出(p165)
- 53.逆序数组(p165)
- 54.杨辉三角(p165)
- 55.魔方矩阵
- 55.找出一个二维数组中的鞍点(p165)
- 56.折半查找(p165)
- 57.统计输入的三行中,大小写字母、数字、空格的数量
- 58.模拟实现strcat
- 59.模拟实现strcmp
- 60.模拟实现strcpy
- 61.回文数
- 第七章
- 62.函数嵌套求4个数的最大值(p180)
- 63.汉诺塔问题(p188)
- 64.写一个函数,调用该函数可求出最大、最小、平均值(p198)
- 65. 有一个字符串,输入一个字符,删除该字符串中的该字符(p213)
- 66,反转字符串(p216课后习题)
- 67. 写一个函数,输入一个4位数字,要求输出这4个数字字符,两个数字之间空一个空格(p216)
- 68.写一个函数,输入一行字符,将字符串中最长的单词输出(p216)
- 69. 输入10个学生5门课程的成绩,分别用函数实现以下功能(p216)
- 70.进制转换,函数实现(p216)
- 70.0-7所能组成奇数的个数
- 71.用递归法将一个整数n转换为字符串(p216)
- 72.给出年月日,计算该日是该年的第几天(p216)
- 第八章(均使用指针)
- 73.删除出现在a串中的b串中的元素
- 74.按由大到小顺序输出两数,指针实现(p227)
- 75.使用指针将n个整数按相反顺序存放(p242)
- 76. 输入三个字符串,由小到大输出(p291)
- 77.输入10个数,将最小数与第一个交换,最大数与最后一个交换(p291)
- 78.n个整数,使前面各数向后移动m个位置,最后m个数变成最前面m个数(p291)
- 79.n个人围一圈报数(p291)
- 80.写一个函数,求字符串的长度(p291)
- 81.从该字符串的第m的字符开始,全部复制到另一个字符串中(p291)
- 82.输入一行字符串,统计大小写字母、数字、空格和其它字符的个数(p291)
- 83.写一个函数,转置矩阵(p291)
- 84. 5×5数组,将最大值放在中间位置,4个最小值放在四个角上(p291)
- 85.10个字符串,对他们进行排序(p291)
- 86.逆序10个数(p291)
- 87.写三个函数,实现以下功能(数组实现)
- 88.输入一个字符串,统计其中连续数字的个数,并将数字放在一个数组中
- 89.输入月份,输出对应的英文单词,使用指针数组处理
- 自己遇到的其它题目
所有题目均个人手动整理,如有错误,请指正
第一章
1. 求两个整数之和(p7)
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int sum = 0;
scanf("%d %d", &a, &b);
sum = a + b;
printf("sum=%d", sum);
return 0;
}
第二章
2. 求三个数中的较大值(用函数)(p14、p107)
写法一:
//求三个数中的较大值(用函数)
#include<stdio.h>
int Max(int a, int b, int c)
{
int max = 0;
max = a > b ? a : b;
max = max > c ? max : c;
return max;
}
int main()
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
scanf("%d %d %d", &a, &b, &c);
max = Max(a, b, c);
printf("max=%d", max);
return 0;
}
写法二:
#include<stdio.j>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int max = 0;
scanf("%d %d %d", &a, &b, &c);
if(a > b)
{
max = a;
}
else
{
max = b;
}
if(c > max)
{
max = c;
}
printf("max=%d", max);
return 0;
}
3.求1×2×3…×n(求n的阶乘,用for循环与while循环)(P17)
1.循环求n的阶乘
#include<stdio.h>
int main()
{
int i = 1;
int n = 0;
int sum = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum = sum * i;
}
/*
while (n)
{
sum = sum * i;
i++;
n--;
}
*/
printf("%d\n", sum);
return 0;
}
2.递归求n的阶乘(n< 10)
n! = (n-1)! * n
#include<stdio.h>
int func(int n)
{
if( n == 0)
{
return 1;
}
else
{
return n * func(n - 1);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = func(n);
printf("%d\n", ret);
return 0;
}
4.有M个学生,输出成绩在80分以上的学生的学号和成绩,并统计人数(p18)
#include<stdio.h>
#define M 4
int main()
{
int arr[M][2] = { 0 };
int i = 0;
int number = 0;
int score = 0;
int count = 0;
for (i = 0; i < M; i++)
{
scanf("%d %d", &arr[i][0], &arr[i][1]);
}
for (i = 0; i < M; i++)
{
if (arr[i][1] > 80)
{
printf("学号:%d 分数:%d\n", arr[i][0], arr[i][1]);
count++;
}
}
printf("80分以上的共%d人\n", count);
return 0;
}
5.判断200-2500的每一年是否是闰年,并将结果输出。非闰年如何求呢?(p18)
#include<stdio.h>
int main()
{
int i = 0;
for (i = 2000; i <= 2500; i++)
{
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
{
printf("%d年是闰年\n", i);
}
else
{
printf("%d年不是闰年\n", i);
}
}
return 0;
}
如何求非闰年?
#include<stdio.h>
int main()
{
int i = 0;
for (i = 2000; i <= 2500; i++)
{
//方法一:对闰年的要求逐个取反
//if(i % 4 !=0 || i % 100 ==0 && i % 400 != 0)
//方法二:直接对闰年整个取反 !(闰年要求)
if (!((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)))
{
printf("%d年不是闰年\n", i);
}
}
return 0;
}
6.求1-1/2+1/3-1/4…+1/99-1/100(有坑!p19)
#include<stdio.h>
int main()
{
int i = 0;
//特别注意 一定要有变量是浮点型!!
float flag = 1;
float sum = 0;
for (i = 1; i <= 100; i++)
{
sum += flag / i;
flag = -flag;
}
printf("%f\n", sum);
return 0;
}
6.1变形:1-1/22+1/333-1/4444…+1/nnnnn…(n不大于9)
#include<stdio.h>
int main()
{
int i = 0;
//特别注意 一定要有变量是浮点型!!
float flag = 1;
float sum = 0;
int n = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
int m = i;//记录当前数是几
for (int j = 1; j < i; j++)
{
m = i + m * 10;//算分母
}
sum += flag / m;
flag = -flag;
}
printf("%f\n", sum);
return 0;
}
7.判断素数(p20)
1.用2-(i-1)去试除
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int j = 0;
int sum = 0;
for (i = 100; i < 1000; i++)
{
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (j == i)
{
printf("%d ", i);
sum++;
}
}
printf("\n%d\n", sum);
return 0;
}
2.用2-根号i去试除
#include<math.h>
int main()
{
int i = 0;
int j = 0;
int sum = 0;
for (i = 100; i < 1000; i++) //优化3:for (i = 101; i < 1000; i += 2)
{ //因为偶数一定不是素数
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
printf("%d ", i);
sum++;
}
}
printf("\n%d\n", sum);
return 0;
}
3.递归
递归
判断一个数是否是素数
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
bool isPrime(int n, int i) {
if (n <= 1) {
return false;
}
if (i > sqrt(n)) {
return true;
}
if (n % i == 0) {
return false;
}
return isPrime(n, i + 1);
}
int main() {
int num;
printf("请输入一个正整数:");
scanf("%d", &num);
if (isPrime(num, 2)) {
printf("%d是素数\n", num);
} else {
printf("%d不是素数\n", num);
}
return 0;
}
1000以内的素数
#include <stdio.h>
int isPrime(int num, int i) {
if (i == 1) {
return 1;
} else {
if (num % i == 0) {
return 0;
} else {
return isPrime(num, i - 1);
}
}
}
void printPrimes(int n) {
if (n > 1) {
if (isPrime(n, n - 1)) {
printf("%d ", n);
}
printPrimes(n - 1);
}
}
int main() {
printf("1000以内的素数有:\n");
printPrimes(1000);
return 0;
}
8.分解一个数的质因数
判断一个数是否是素数
int isPrime(int n)
{
if (n < 2)
{
return 0;
}
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
分解
void factorize(int n)
{
int i = 0;
for (i = 2; i <= n; i++)
{
//如果i是质数且是n的因数
if (isPrime(i) && n % i == 0)
{
printf("%d ", i);
n = n / i;//n要变小,需要判断剩下的数是不是质因数
//继续输出相同的质因数
while (n % i == 0)
{
printf("%d ", i);
n /= i;
}
//如果n变为1,说明已经分解完毕
if (n == 1)
{
break;
}
}
}
}
int main()
{
int num;
printf("请输入一个数:");
scanf("%d", &num);
printf("分解后的质因数:");
factorize(num);
printf("\n");
return 0;
}
9.输入10个数,从中找最大(p35)
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int max = arr[0];
//只需从1下标开始
for (i = 1; i < 10; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
printf("max=%d", max);
return 0;
}
10.有三个数a,b,c,按大小顺序输出(使用函数p35)
#include<stdio.h>
void swap(int* n, int* m)
{
int tmp = *n;
*n = *m;
*m = tmp;
}
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
if (a < b)
swap(&a, &b);
if (a < c)
swap(&a, &c);
if (b < c)
swap(&b, &c);
//a最大,c最小
printf("%d %d %d\n", a, b, c);
return 0;
}
11.判断一个数能否被3和5整除(p35)
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (0 == a % 3 && 0 == a % 5)
{
printf("%d能被3和5整除\n", a);
}
else
printf("%d不能被3和5整除\n", a);
return 0;
}
12.求两个数m和n的最大公约数,以及最小公倍数(p35、p137)
最小公倍数=两数的积÷最大公约数
1.暴力求解法
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int total = 0;
scanf("%d %d", &n, &m);
total = n * m;//两数之积
int min = n < m ? n : m;
while (1)
{
if (n % min == 0 && m % min == 0)
{
break;
}
min--;
}
//此时min为最大公约数
//最小公倍数就等于:两个数的乘积/最大公约数
printf("%d\n", min);
printf("%d\n", total / min);
}
2.辗转相除法
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int total = 0;
scanf("%d %d", &n, &m);
total = n * m;//两数之积
while (n % m)
{
int tmp = n % m;
n = m;
m = tmp;
}
//此时m为最大公约数
//最小公倍数就等于:两个数的乘积/最大公约数
printf("%d\n", m);
printf("%d\n", total / m);
3.递归
- 更相减损法
以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到它们两个数相等为止。则相等的两个数就是所求的最大公约数。
#include<stdio.h>
int Fun(int n, int m)
{
if (n > m)
{
return Fun(m, n - m);
}
else if (n < m)
{
return Fun(n, m - n);
}
//两数相等
else
return n;
}
int main()
{
int n = 0;
int m = 0;
int total = 0;
scanf("%d %d", &n, &m);
total = n * m;//两数之积
int ret = Fun(n, m);
printf("%d\n", ret);
printf("%d\n", total /ret);
return 0;
}
- 辗转相除法
此递归和辗转相除法相似
#include<stdio.h>
int Fun(int n, int m)
{ // while (n % m)
if (m == 0) //{
return n; // int tmp = n % m;
else // n = m;
return Fun(m, n % m); // m = tmp;
//}
//printf("%d\n", m);
}
int main()
{
int n = 0;
int m = 0;
int total = 0;
scanf("%d %d", &n, &m);
total = n * m;//两数之积
int ret = Fun(n, m);
printf("%d\n", ret);
printf("%d\n", total / ret);
return 0;
}
13.求方程ax^2+bx+c=0的根(p35)
#include<stdio.h>
#include<math.h>
int main()
{
double a, b, c;
double flag = 0;
double x1, x2;
scanf("%lf %lf %lf", &a, &b, &c);
flag = b * b - 4 * a * c;
if (flag > 0)
{
x1 = (-b + sqrt(flag)) / (2 * a);
x2 = (-b - sqrt(flag)) / (2 * a);
printf("方程有两个不相等的实根:x1=%f,x2=%f\n", x1, x2);
}
else if (flag < 0)
{
printf("方程无解\n");
}
else
{
x1 = x2 = -b / (2 * a);
printf("方程有两个不相等的实根:x1=x2=%f\n", x1);
}
return 0;
}
第三章
14.温度转换(p37)
#include<stdio.h>
int main()
{
float temperature = 0;
float Ht = 0;
scanf("%f", &temperature);
Ht = ( 5.0 / 9) * (temperature - 32);
printf("%f\n", Ht);
return 0;
}
15.大小写字母转换(p54)
#include<stdio.h>
int main()
{
char ch1 = '0';
char ch2 = '0';
scanf("%c", &ch1);
//大写转小写
if (ch1 >= 97)
{
ch2 = ch1 - 32;
}
//小写转大写
else
{
ch2 = ch1 + 32;
}
printf("%c\n", ch2);
return 0;
}
16.给出三角形边长,求三角形的面积(p58)
#include<stdio.h>
#include<math.h>
int main()
{
double a = 0;
double b = 0;
double c = 0;
double area = 0;
double s = 0;
scanf("%lf %lf %lf", & a, & b, & c);
s = (a + b + c) / 2;
//能构成三角形 (任意两边之和大于第三边)
if (a + b > c && a + c > b && c + b > a)
{
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("area= %lf\n", area);
}
else
{
printf("不是三角形!\n");
}
return 0;
}
17.译码p82、p135
int main()
{
char ch = 0;
while ((ch = getchar()) != '\n')
{
//如果是字母
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
{
//是最后四个字母,就减22
if (ch >= 'w' && ch <= 'z' || ch >= 'W' && ch <= 'Z')
{
ch = ch - 22;
}
//加4
else
{
ch = ch + 4;
}
printf("%c", ch);
}
//是数字
else
printf("%c", ch);
}
return 0;
}
18.计算面积p82
#include<stdio.h>
int main()
{
double r, heigh, circle, area, superarea, v1, v2;
double pi = 3.14;
scanf("%lf %lf", &r, &heigh);
printf("圆的周长:%lf\n", 2 * pi * r);
printf("圆的面积:%lf\n", pi * r * r);
printf("圆球的表面积:%lf\n", 4 * pi * r * r);
printf("圆球的体积:%lf\n", 4.0 / 3 * pi * r * r * r);
printf("圆柱的体积:%lf\n", pi * r * r * heigh);
return 0;
}
第四章
19.输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)
#include<stdio.h>
#include<math.h>
int main()
{
int num = 0;
do
{
scanf("%d", &num);
if (num > 1000 || num <= 0)
{
printf("输入错误,请重新输入\n");
}
} while (num > 1000 || num <= 0); //不在1-1000范围内就重新输入
int ret = sqrt(num);
printf("%d\n", ret);
return 0;
}
20.有一个函数,输入x,输出y相应的值(p108)
注意:乘号
#include<stdio.h>
int main()
{
int x = 0;
int y = 0;
scanf("%d", &x);
if (x < 1)
{
y = x;
printf("x=%d y=x=%d\n",x, y);
}
if (x >= 1 && x < 10)
{
y = 2 * x - 1;
printf("x=%d y=2x-1=%d\n", x, y);
}
if (x >= 10)
{
y = 3 * x - 11;
printf("x=%d y=3x-11=%d\n", x, y);
}
return 0;
}
21.给出100制成绩,要求输出等级(P108)
90分以上为 :A ,80-89为:B,70-79为:C,60-69为:D,60分以下为:E
#include<stdio.h>
int main()
{
double score = 0.0;
scanf("%lf", &score);
char grade = 0;
switch ((int)(score / 10)) //由于switch语句中只能是整型表达式,所以应该强制类型转换
{
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
default:
grade = 'E';
break;
}
printf("%c\n", grade);
return 0;
}
22.给一个不多于5位的正整数!!!!!(P109)
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123
递归正序输出
#include<stdio.h>
void print(int num)
{
if (num > 9)
{
print(num / 10);//先递归到只有第一位数
}
printf("%d ", num % 10);//每次仅输出一位
}
int main()
{
int num = 0;
do
{
scanf("%d", &num);
} while (num >= 100000 || num <= 0); //不是五位数内的正整数就重新输入
//1. 求他是一个几位数
int count = 1;
int tmp = num;
while (tmp > 9)
{
count++;
tmp = tmp / 10;
}
printf("%d是一个%d位数\n", num, count);
//2.输出每一位
print(num);
printf("\n");
//3.逆序输出
while (num)
{
printf("%d ", num % 10);
num = num / 10;
}
return 0;
}
循环正序输出
int main()
{
int m;
scanf("%d", &m);
int count = 1;
int tmp = m;
while (tmp>9)
{
count++;
tmp /= 10;
}
printf("%d位数\n", count);
int n = 1;
for (int i = 1; i < count; i++)
{
n *= 10;
}
tmp = m;
for (n; n > 0; n /= 10)
{
printf("%d ", tmp / n);
tmp %= n;
}
printf("\n");
tmp = m;
while (tmp)
{
printf("%d ", tmp % 10);
tmp /= 10;
}
return 0;
}
23.输入4个整数,要求按从小到大的顺序输出p109
与第9题相似
24.输出乘法口诀表
左上
int main()
{
for (int i = 9; i > 0; i--)
{
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", j, i, j * i);
}
printf("\n");
}
return 0;
}
左下
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d*%d=%2d ", j, i, j * i);
}
printf("\n");
}
}
右上
int main()
{
for (int i = 9; i>0; i-- )
{
for (int k = 0; k < 9-i; k++)
{
printf("\t");
}
for (int j = 1; j <= i; j++)
{
printf("%2d*%2d=%2d", j, i, i * j);
}
printf("\n");
}
return 0;
}
for (i = 1; i<=9; i++)
{
for (j = 1; j <= 9; j++)
{
if (j < i)
{
printf("\t");
}
else
{
printf("%d*%d=%d\t", j, i, j * i);
}
}
printf("\n");
}
右下
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int k = 0; k < 9 - i; k++)
{
printf("\t");
}
for (int j = 1; j <= i; j++)
{
printf("%2d*%2d=%2d",i, j, i*j);
}
printf("\n");
}
return 0;
}
第五章
25.求1-100的和
#include<stdio.h>
int main()
{
int sum = 0;
int i = 1;
/*for (i = 1; i <= 100; i++)
{
sum += i;
}*/
while (i <= 100)
{
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
26.学校1000名学生捐款,总数到达10万元结束,统计捐款人数及平均捐款数目(P122)
#include<stdio.h>
#define M 100000
int main()
{
double money = 0;
double sum = 0;
double ave = 0;
int i = 0;
for (i = 1; i <= 1000; i++)
{
scanf("%lf", &money);
sum += money;
if (sum >= M)
{
break;
}
}
ave = sum / i; //注意此处是i
printf("人数:%d,平均每人捐:%lf\n", i, ave);
return 0;
}
27.输出100-200不能被3整除的数(p123)
#include<stdio.h>
int main()
{
int i = 0;
//int count = 0;
for (i = 100; i <= 200; i++)
{
if (i % 3 == 0)
{
continue;
}
else
{
printf("%d ", i);
//count++;
}
//5个数一行
/*if (count % 5 == 0)
{
printf("\n");
}*/
}
return 0;
}
28.输出下列矩阵(p125)
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 4; i++) //几行
{
for (j = 1; j <= 5; j++) //几列
{
printf("%2d ", i * j);
}
printf("\n");
}
return 0;
}
29.用公式 π/4≈1-1/3+1/5-1/7+…求π的近似值,直达发现某一项的绝对值小于10-6为止。(p127)
#include<stdio.h>
#include<math.h>
int main()
{
double pi = 0;
double den = 1;
double term = 1.0;
int flag = 1;
while (fabs(term) >= 1e-6)
{
pi = pi + term; //累加
den = den + 2; //分母
flag = -flag;
term = flag / den; //某一项
}
pi = 4 * pi;
printf("pi=%lf\n", pi);
return 0;
}
30求100-200之间的全部素数
int main()
{
int i = 0;
int count = 0;
for (i = 100; i < 200; i++)
{
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (j >= i)
{
printf("%d ", i);
count++;
if (count % 10 == 0) //10个换一行
{
printf("\n");
}
}
}
return 0;
}
优化:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i += 2)
{
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
printf("%d ", i);
count++;
if (count % 10 == 0)
{
printf("\n");
}
}
}
return 0;
}
31.求斐波那契数列得前40 个数(p129)
方法1:循环
#include<stdio.h>
int main()
{
int f1 = 1;
int f2 = 1;
printf("%12d%12d", f1, f2);
//int i = 3;
int i = 0;
int f3 = 0;
for (i = 1; i <= 38; i++)
{
f3 = f1 + f2;
printf("%12d", f3);
f1 = f2;
f2 = f3;
}
/*while (i <= 40)
{
f3 = f1 + f2;
printf("%12d", f3);
f1 = f2;
f2 = f3;
i++;
}*/
return 0;
}
数组
int main()
{
int arr[40] = { 1,1 };
int i = 0;
for (i = 2; i < 40; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
for (i = 0; i < 40; i++)
{
printf("%12d", arr[i]);
//为了避免0的时候换行
if ((i+1) % 5 == 0)
{
printf("\n");
}
}
return 0;
}
方法2:递归
int fib(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 40; i++)
{
int ret = fib(i);
printf("%12d", ret);
}
return 0;
}
方法3:一次求两个数
一次求两个数
#include<stdio.h>
int main()
{
int f1 = 1;
int f2 = 1;
int i = 0;
for (i = 1; i <= 20; i++)
{
printf("%12d%12d", f1, f2);
f1 = f1 + f2;
f2 = f2 + f1;
}
return 0;
}
32.统计输入的一行中字母、空格、数字和其它字符的个数(p137)
#include<stdio.h>
int main()
{
char ch = 0;
int character = 0;
int number = 0;
int spacing = 0;
int other = 0;
while ((ch = getchar()) != '\n')
{
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
{
character++;
}
else if (ch >= '0' && ch <= '9')
{
number++;
}
else if (ch == ' ') //也可写成ch == 32(空格的ascll码为32)
{
spacing++;
}
else
other++;
}
printf("character = %d, number = %d, spacing = %d, other = %d\n", character, number, spacing, other);
return 0;
}
33求a+aa+aaa+aaaa+aaaaa…nn…nn的值,n表示a的位数,a是一个数字,二者都由键盘输入(p137)
int main()
{
int a = 0;
int n = 0;
scanf("%d %d", &a, &n);
int count = 0;
int sum = 0;
int tmp = a;
while (count < n)
{
printf("%d ", a);
sum += a;
a = a * 10 + tmp; //2*10+2 22*10+2 222*10+2
count++;
}
printf("\nsum = %d\n", sum);
return 0;
}
34. 1!+2!+3!+4!+5!..+n!(p137)
方法1:双层for
int main()
{
int n = 0;
scanf("%d", &n);
double sum = 0; //一定得是double
for (int i = 1; i <= n; i++)
{
double ret = 1;
for (int j = 1; j <= i; j++)
{
//求一个数的阶乘
ret = ret * j;
}
//把每个数的阶乘相加
sum += ret;
}
printf("%lf\n", sum);
return 0;
}
方法2:单层循环
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
double sum = 0;
double ret = 1;
for (i = 1; i <= n; i++)
{
ret = ret * i;
sum += ret;
}
//int a = 1;
//while (n)
//{
// ret = ret * a; //n! = (n-1)! * n
// a++;
// sum += ret;
// n--;
//}
printf("%lf\n", sum);
return 0;
}
35.求1000以内的水仙花数,例:153 = 13 + 53 + 33(p137)
#include<stdio.h>
int main()
{
int i = 0;
int a, b, c ,sum;
for (i = 100; i < 1000; i++)
{
a = i / 100;
b = i / 10 % 10;
c = i % 10;
sum = a * a * a + b * b * b + c * c * c;
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
36.求1000以内的完美数(一个数恰好等于其真因子之和)例:6 = 1+2+3
循环
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 1000; i++)
{
int sum = 0;
int j = 0;
for (j = 1; j < i; j++)
{
if (i % j == 0)
{
sum += j;
}
}
if (sum == i)
{
printf("%d is factors are ", i);
for (j = 1; j < i; j++)
{
if (i % j == 0)
{
printf("%d ", j);
}
}
printf("\n");
}
}
return 0;
}
递归写法
int fun(int n, int m)
{
if (m == 1)
{
return 1;
}
else
{
//当前数能整除它
if (n % m == 0)
{
return m + fun(n, m - 1);//当前数+其余能整数它的数
}
//换下一个数
else
{
return fun(n, m - 1);
}
}
}
void func(int n)
{
int num = fun(n, n / 2);//从一半开始
if (num == n)
{
printf("%d是完全数\n",n);
}
}
int main()
{
for (int i = 2; i < 1000; i++)
{
func(i);
}
return 0;
}
37.求一个分数序列的前20项和(p138)
2/1+3/2+5/3+8/5+13/8…
#include<stdio.h>
int main()
{
int i = 0;
double n = 1;//分母
double m = 2;//分子
double sum = 0;
for (i = 0; i < 20; i++)
{
printf("%lf/%lf\n", m, n);
double tmp = n + m;
sum += m / n;
n = m;//新的分母
m = tmp;//新的分子
}
printf("%lf\n", sum);
return 0;
}
使用数组
int main()
{
int i = 0;
float arr[22] = { 1,1 };
float sum = 0;
for (i = 2; i < 22; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
sum += arr[i] / arr[i - 1];
}
printf("%f\n", sum);
return 0;
}
38.自由落体(p138)
#include<stdio.h>
int main()
{
float sum = 100;
float h = sum / 2;
for (int i = 2; i <= 10; i++)
{
sum += h * 2;//第n次落地经过的m数
h = h / 2; //接下来反弹多高
}
printf("10次落地共经历%fm\n", sum);
printf("10次反弹%fm\n", h);
return 0;
}
39.猴子吃桃
要点:第一天桃子的数量是第二天桃子的数量加一后的二倍
例:第一天有100个, 吃了51个 ,第二天剩49个 。 (49+1)*2 =100
循环
#include<stdio.h>
int main()
{
int x1 = 0;
int x2 = 1;
int day = 9;
while (day)
{
x1 = (x2 + 1) * 2;
x2 = x1;
day--;
}
printf("共有:%d个\n", x1);
return 0;
}
递归
get_sum(int n)
{
if (n == 10)
{
return 1;
}
else
{
int num = (get_sum(n + 1) + 1) * 2;
return num;
}
}
int main()
{
int sum = get_sum(1);
printf("%d\n", sum);
return 0;
}
40.智能打印菱形
#include<stdio.h>
int main()
{
int n = 0;
//输入打印几行
scanf("%d", &n);
int i = 0;
//打印上半部分
for (i = 0; i < n; i++)
{
//打印空格
int j = 0;
for (j = 0; j < n -1- i; j++)
{
printf(" ");
}
//打印**
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
for (i = 0; i < n - 1; i++)
{
//打印空格
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * (n - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
41.乒乓球比赛
int main()
{
for (int a = 'X'; a <= 'Z'; a++)
{
for (int b = 'X'; b <= 'Z'; b++)
{
if (a != b)
{
for (int c = 'X'; c <= 'Z'; c++)
{
if (a != c && b != c)
{
if (a != 'X' && c != 'X' && c != 'Z')
{
printf("a--%c b--%c c--%c\n", a, b, c);
}
}
}
}
}
}
return 0;
}
第六章
42.冒泡排序(p144)
普通冒泡排序
int main()
{
int arr[10] = { 1,4,8,3,5,0,2,7,9,10 };
int i = 0;
//一共比较多少趟
for (i = 0; i < 10-1; i++)
{
int j = 0;
//每趟比较几次
for (j = 0; j < 10 - 1 - i; j++)
{
//从小到大排列
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
奇数位排序
void sort(int a[], int n)
{
for (int i = 0; i < n - 2; i += 2)
{
for (int j = 0; j < n - 2 - i; j += 2)
{
if (a[j] > a[j + 2])
{
int tmp = a[j];
a[j] = a[j + 2];
a[j + 2] = tmp;
}
}
}
}
void BubbleSort(int* a, int n)
{
for (int i = 1; i < n/2; i++)
{
for (int j = 1; j < n-1-i; j+=2)
{
if (a[j] > a[j + 2])
{
Swap(&a[j], &a[j + 2]);
}
}
}
}
双向冒泡排序
//双向冒泡排序
void d_bubble_sort(int arr[], int num)
{
int left = 0;
int right = num - 1;
//优化,如果数组已经有序,就跳出循环
int flag = 0;
while (left < right)
{
flag = 1;
//从左向右找最大
for (int i = left; i < right; i++)
{
//前>后,交换
if (arr[i] > arr[i + 1])
{
flag = 0;
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
}
//优化,如果遍历了一遍数组,没有发生交换,那就说明数组已经有序了
if (flag == 1)
{
break;
}
right--; //最大值已放在右侧
//从右向左找最小
for (int j = right; j > left; j--)
{
//前>后,交换
if (arr[j] < arr[j - 1])
{
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
left++;//最小值放在左侧
}
}
int main()
{
int arr[10] = { 5,3,7,9,1,2,4,8,6,10 };
int arr2[10] = { 1,2,3,4,5,6,7,8,9,0 };
d_bubble_sort(arr2,10);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
43.选择排序
int main()
{
int arr[10] = { 1,4,8,3,5,0,2,7,9,10 };
int i = 0;
//总共进行多少趟
for (i = 0; i < 9; i++)
{
int j = 0;
int min = i;
//将i后的数进行比较
for (j = i + 1; j < 10; j++)
{
if (arr[min] > arr[j])
{
min = j; //找对最小数的下标
}
}
//将数中的最小值与第一个数交换
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
}
44.插入排序
int main()
{
int arr[10] = { 5,3,9,1,4,2,8,6,7,10 };
for (int i = 1; i < 10; i++)
{
int tmp = arr[i];//存储当前待排序元素
int j = i - 1;//和i下标前面的元素进行比较
while(j >= 0 && tmp > arr[j])
{
arr[j + 1] = arr[j];
j--;
}
//退出循环前j--了,因此为j+1
arr[j + 1] = tmp;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
45.逆置矩阵(p149)
int main()
{
int arr1[2][3] = { 1,2,3,4,5,6 };
int arr2[3][2] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", arr1[i][j]);
arr2[j][i] = arr1[i][j];
}
printf("\n");
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
return 0;
}
不允许创建第二个矩阵,逆置一个n*n的矩阵
一定是j=i
或 j<=i
void reverse(int arr[][3])
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
//j=i
for (j = i; j < 3; j++)
{
int tmp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = tmp;
}
}
}
46.输出一个矩阵中的最大值,以及它的下标(p150)
int main()
{
int arr[3][4] = { 1,2,3,4,9,8,7,6,-1,-5,-8,-4 };
int i = 0;
int j = 0;
int row = 0;
int col = 0;
int max = arr[0][0];
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
if (max < arr[i][j])
{
max = arr[i][j];
row = i;
col = j;
}
}
}
printf("max=%d 下标位:%d,%d\n", max, row, col);
return 0;
}
47.统计单词的个数(p163)
int main()
{
char str[100] = { 0 };
gets(str);
int num = 0;
int word = 0;
int i = 0;
for (i = 0; str[i] != '\0'; i++)
{
char c = str[i];
if (c == ' ') //是空格,则说明当前位置,单词还没开始,或者刚结束
{
word = 0;
}
else if (word == 0) //当前位置不是空格是字符,并且没有操作过,则是一个单词的开始
{
word = 1;
num += word;
}
//如果该位置不是空格,并且前面不是空格,则说明它属于一个单词,不需要计算
}
printf("%d\n", num);
return 0;
}
48.三个字符串,找出最大者(p164)
#include<stdio.h>
#include<string.h>
int main()
{
char arr[3][20];
char str[20];
int i = 0;
for (i = 0; i < 3; i++)
{
gets(arr[i]);
}
if (strcmp(arr[0], arr[1]) > 0)
{
strcpy(str, arr[0]);
}
else
{
strcpy(str, arr[1]);
}
if (strcmp(arr[2], str) > 0)
{
strcpy(str, arr[2]);
}
printf("%s\n", str);
return 0;
}
49.筛选法求素数(p165)
思想:从2开始,用该数去除后面的数,被除数若为素数则置为0;如果该数已被置为0,则换下一个数
//筛选法求1-100的素数
int main()
{
int arr[101] = { 0,0 };
for (int i = 2; i <= 100; i++)
{
arr[i] = i;
}
for (int i = 2; i*i < 100; i++)
{
for (int j = i + 1; j <= 100; j++)
{
//优化
//if (arr[i] == 0)
//{
// break; //当前数以被挖去了,用下一个未被挖去的数除
//}
//if (arr[j] != 0)//用下一个为被挖去的数去除
//{
// if (arr[j] % arr[i] == 0)
// {
// arr[j] = 0;
// }
//}
if (arr[i] != 0 && arr[j] != 0)//用下一个为被挖去的数去除
{
if (arr[j] % arr[i] == 0)
{
arr[j] = 0;
}
}
}
}
int count = 0;
for (int i = 1; i <= 100; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
count++;
if (count % 5 == 0)
printf("\n");
}
}
return 0;
}
50.求矩阵对角线之和(p165)
正对角线
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int sum = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
//横、纵坐标相等则是正对角线
if (i == j)
{
sum += arr[i][j];
}
}
}
printf("%d\n", sum);
return 0;
}
反对角线
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int sum = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
//横、纵坐标的和等于:行数/列数减一
if (i+j == 3-1)
{
sum += arr[i][j];
}
}
}
printf("%d\n", sum);
return 0;
}
51.打印如下矩阵
找行与列的关系
int main()
{
int arr[5][5];
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (i < j)
{
arr[i][j] = 0;
}
else
{
arr[i][j] = i - j + 1;
}
}
}
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
52.向一个有序数组中插入一个数,按顺序输出(p165)
#include<stdio.h>
int main()
{
int arr[11] = { 1,2,3,4,5,6,7,8,9,10 };
int insert = 0;
scanf("%d", &insert);
int i = 0;
//从后往前遍历
for (i = 9; i >= 0; i--)
{
//arr[i] > insert,arr[i]往后移
if (arr[i] > insert)
{
arr[i + 1] = arr[i];
}
else
{
arr[i + 1] = insert;
//插入后,停止遍历
break;
}
}
//如果insert是最小的,那么i就减到了-1
if (i < 0)
{
arr[0] = insert;
}
for (i = 0; i <= 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
53.逆序数组(p165)
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
54.杨辉三角(p165)
方法一数组循环
int main()
{
int arr[10][10] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0 || i == j)
{
arr[i][j] = 1;
}
else
{
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
}
for (i = 0; i < 10; i++)
{
//打印空格
for (j = 0; j < 10 - i; j++)
printf(" ");
for (j = 0; j <= i; j++)
{
printf("%4d", arr[i][j]);
}
printf("\n");
}
return 0;
}
方法二递归
int func(int m, int n)
{
if (m == n || n == 0)
{
return 1;
}
else
return func(m - 1, n) + func(m - 1, n - 1);
}
int main()
{
int line = 0;
scanf("%d", &line);
int i = 0;
int j = 0;
for (i = 0; i < line; i++)
{
for (j = 0; j < line - i; j++)
{
printf(" ");
}
for (j = 0; j <=i; j++)
{
printf("%4d", func(i, j));
}
printf("\n");
}
return 0;
}
55.魔方矩阵
//n阶魔方阵,n为3-100之间的奇数
int main()
{
int arr[50][50] = { 0 };
int n = 0;
int row = 0;
int col = 0;
int prevRow = 0;
int prevCol = 0;
while (1)
{
printf("请输入魔方阵的阶数,阶数属于3-100之间的奇数:\n");
scanf("%d", &n);
//判断输入的是否符合要求
if ((n >= 3 && n <= 100) && (0 != n % 2))
{
break;
}
}
row = col = n / 2;
arr[row][col] = 1;
//生成2-n*n之内的数
for (int i = 2; i <= n * n; i++)
{
row--;//上一行
col++;//下一列
//将数组看成回绕的
if (row < 0)
{
row = n - 1;
}
if (col >= n)
{
col = 0;
}
if (0 != arr[row][col])
{
//如果上一行、下一列已经有元素了
//那下一个元素存放在 当前列 的下一行
row = prevRow + 1;
col = prevCol;
}
//下一个元素存放在当前元素的上一行、下一列
arr[row][col] = i;
//记录当前行和列
prevRow = row;
prevCol = col;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%5d", arr[i][j]);
}
printf("\n");
}
return 0;
}
55.找出一个二维数组中的鞍点(p165)
鞍点:即该位置上的元素在该行上最大,在该列上最小。
一个数组也可能没有鞍点
int main()
{
int arr[3][3] = { {1,3,10}, {2,4,9}, {6,7,5} };
int i = 0;
int j = 0;
int flag = 1; //假设该数组有鞍点
for (i = 0; i < 3; i++)
{
flag = 1;//假设鞍点在该行中
//先假设每行第一个数最大
int max_min = arr[i][0];
int col = 0;//记下该数是哪一列
for (j = 0; j < 3; j++)
{
//如果max_min不是该行最大的,就换
if (arr[i][j] > max_min)
{
max_min = arr[i][j];
col = j;
}
}
//再遍历每一行的col列,比较是否是该列最小
int k = 0;
for (k = 0; k < 3; k++)
{
if (arr[k][col] < max_min)
{
flag = 0;
break; //有比该数小的数,则该数不是鞍点
}
}
if (flag == 1)
{
printf("该数组的鞍点是:arr[%d][%d]=%d\n", i, col, max_min);
break;
}
}
if (flag == 0)
{
printf("该数组没有鞍点\n");
}
return 0;
}
56.折半查找(p165)
int main()
{
int arr[15] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
int input = 0;
scanf("%d", &input);
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int flag = 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (input == arr[mid])
{
printf("找到了,下标是:%d\n", mid);
flag = 0;
break;
}
else if (input < arr[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
//if (left > right)
if (flag)
{
printf("找不到\n");
}
return 0;
}
57.统计输入的三行中,大小写字母、数字、空格的数量
int main()
{
char arr[3][80];
int upc = 0;
int lowc = 0;
int dig = 0;
int spa = 0;
int other = 0;
int i = 0;
for (i = 0; i < 3; i++)
{
printf("输入第%d行:", i+1);
gets(arr[i]);
int j = 0;
for (j = 0; j < 80 && arr[i][j] != '\0'; j++)
{
if (arr[i][j] >= 'A' && arr[i][j] <= 'Z')
{
upc++;
}
else if (arr[i][j] >= 'a' && arr[i][j] <= 'z')
{
lowc++;
}
else if (arr[i][j] >= '0' && arr[i][j] <= '9')
{
dig++;
}
else if (arr[i][j] == ' ')
{
spa++;
}
else
{
other++;
}
}
}
printf("大写:%d,小写:%d,数字:%d,空格:%d, 其它:%d\n", upc, lowc, dig, spa, other);
return 0;
}
58.模拟实现strcat
- 数组
int main()
{
char str1[20] = { "hello-" };
char str2[20] = { "world" };
int i = 0;
int j = 0;
while (str1[i] != '\0')
{
i++;
}
while (str2[j] != '\0')
{
str1[i] = str2[j];
i++;
j++;
}
str2[i] = '\0';
printf("%s\n", str1);
return 0;
}
- 指针
char* my_strcat(char* dest, char* src)
{
//
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
//第一种写法
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
//第二种写法
/*while (*dest++ = *src++)
{
;
}*/
return ret;
}
int main()
{
char str1[20] = "hello-";
char* str2 = "world";
char* ret = my_strcat(str1, str2);
printf("%s\n", ret);
return 0;
}
59.模拟实现strcmp
- 数组
int main()
{
char str1[20] = { 0 };
char str2[20] = { 0 };
gets(str1);
gets(str2);
int i = 0;
int j = 0;
int ret = 0;
while(str1[i] == str2[i] && str1[i] != '\0')
{
i++;
}
if (str1[i] == str2[i] && str1[i] == '\0')
{
ret = 0;
}
else
{
ret = str1[i] - str2[i];
}
printf("%d\n", ret);
return 0;
}
- 指针
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2 )
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char str1[20] = { 0 };
char str2[20] = { 0 };
gets(str1);
gets(str2);
int ret = my_strcmp(str1, str2);
printf("%d\n", ret);
return 0;
}
60.模拟实现strcpy
1.数组
#include<stdio.h>
#include<string.h>
int main()
{
char str1[20] = { 0 };
char str2[20] = { 0 };
gets(str2);
int len = strlen(str2);
for (int i = 0; i <= len; i++)
{
str1[i] = str2[i];
}
printf("%s\n", str1);
return 0;
}
- 指针
void my_strcpy(char* dest, char* src)
{
while (*dest = *src)
{
dest++;
src++;
}
}
int main()
{
char str1[20] = { 0 };
char str2[20] = { 0 };
gets(str2);
my_strcpy(str1, str2);
printf("%s\n", str1);
return 0;
}
61.回文数
不用数组
int isPalindrome(int num) {
int originalNum = num;
int reversedNum = 0;
while (num > 0) {
reversedNum = reversedNum * 10 + num % 10;
num /= 10;
}
if (originalNum == reversedNum) {
return 1; // 是回文数
} else {
return 0; // 不是回文数
}
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (isPalindrome(num)) {
printf("%d 是回文数\n", num);
} else {
printf("%d 不是回文数\n", num);
}
return 0;
}
使用数组
int isPalindrome(int num) {
int originalNum = num;
int digits[10]; // 假设最多10位数
int numDigits = 0;
// 将数字的每一位存入数组
while (num > 0) {
digits[numDigits] = num % 10;
num /= 10;
numDigits++;
}
// 检查数组中的数字是否构成回文数
int i = 0;
int j = numDigits - 1;
while (i < j) {
if (digits[i] != digits[j]) {
return 0; // 不是回文数
}
i++;
j--;
}
return 1; // 是回文数
}
第七章
62.函数嵌套求4个数的最大值(p180)
#include<stdio.h>
int Max2(int x, int y)
{
return x > y ? x : y;
}
int Max_1(int a, int b, int c, int d)
{
int m = 0;
m = Max2(a, b);
m = Max2(m, c);
m = Max2(m, d);
return m;
}
int main()
{
int a, b, c, d, max;
scanf("%d %d %d %d", &a, &b, &c, &d);
max = Max_1(a,b,c,d);
printf("%d\n",max);
return 0;
}
63.汉诺塔问题(p188)
#include<stdio.h>
void move(char x, char y)
{
printf("%c--->%c\n", x, y);
}
void hanoi(int n, char A, char B, char C)
{
//A盘只剩一个,直接移动到C盘
if (n == 1)
{
move(A, C);
}
else
{
//n-1个,从A盘借助C移到B盘
hanoi(n - 1, A, C, B);
//第n个从A盘移动到C盘
move(A, C);
//n-1个,从B盘借助A移到C盘
hanoi(n - 1, B, A, C);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
64.写一个函数,调用该函数可求出最大、最小、平均值(p198)
//全局变量
int Max = 0;
int Min = 0;
float average(int arr[], int n)
{
int i = 0;
float sum = 0;
Max = Min = arr[0];
for (i = 0; i < n; i++)
{
if (arr[i] > Max)
{
Max = arr[i];
}
else if (arr[i] < Min)
{
Min = arr[i];
}
sum += arr[i];
}
return sum / n;
}
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
float ave = average(arr, 10);
printf("max=%d min=%d ave=%f\n", Max, Min, ave);
return 0;
}
65. 有一个字符串,输入一个字符,删除该字符串中的该字符(p213)
1.使用数组
void Delete(char c[], char ch)
{
int i = 0;
int j = 0;
for (i = 0; c[i] != '\0'; i++)
{
if (c[i] != ch)
{
c[j] = c[i]; // 自己放自己里面
j++;
}
}
c[j] = '\0';
}
int main()
{
char arr[] = "I am student";
char ch = 0;
printf("%s\n", arr);
scanf("%c", &ch);
Delete(arr, ch);
printf("%s\n", arr);
}
2.使用指针
void Delete(char* c, char ch)
{
char* point = c;
while (*point != '\0')
{
if (*point != ch)
{
//当前字符不是要删除的字符,就放进c中
*c = *point;
//放完后c++
c++;
}
//1.放进c中后,point也++
//2.是要删除的字符,直接跳过
point++;
}
*c = '\0';//最后*c的位置放上\0
}
int main()
{
char arr[] = "I am student";
char ch = 0;
printf("%s\n", arr);
scanf("%c", &ch);
Delete(arr, ch);
printf("%s\n", arr);
}
66,反转字符串(p216课后习题)
#include<stdio.h>
#include<string.h>
void reverse(char c[], int left, int right)
{
while (left <= right)
{
char tmp = c[left];
c[left] = c[right];
c[right] = tmp;
left++;
right--;
}
}
void Print(char arr[])
{
int i = 0;
for (i = 0; arr[i] != '\0'; i++)
{
printf("%c", arr[i]);
}
printf("\n");
}
int main()
{
char arr[] = "abcdef";
int start = 0;
int end = strlen(arr)-1;
Print(arr);
reverse(arr, start, end);
Print(arr);
return 0;
}
67. 写一个函数,输入一个4位数字,要求输出这4个数字字符,两个数字之间空一个空格(p216)
#include<stdio.h>
#include<string.h>
void func(char str[])
{
//0123 4
//3689 \0
//01234567 8
//3 6 8 9 \0
int i = 0;
//第一个数字不动
//别忘记\0
for (i = strlen(str); i > 0; i--)
{
str[2 * i] = str[i];
str[2 * i - 1] = ' ';
}
printf("%s", str);
}
int main()
{
char str[10];
scanf("%s", &str);
func(str);
return 0;
}
68.写一个函数,输入一行字符,将字符串中最长的单词输出(p216)
#include<ctype.h>
int Max_word(char* str, int* count)
{
int length = 0;
int i = 0;
int ret = 0;
int flag = 0;//标记单词的开始
int tmp = 0;
while (str[i] != '\0')
{
if (isalpha(str[i])) //是字母
{
if (flag == 0)
{
tmp = i;//记录单词的起始下标
flag = 1;
}
length++;
}
else //不是字母,当前单词结束,比较长度
{
//该单词目前最长,保存起始位置及长度
if (length > *count)
{
*count = length;
ret = tmp;
}
//长度清0,下标清0
length = 0;;
tmp = 0;
flag = 0;
}
i++;
}
//为了防止最后一个单词最长,还需要比较一次
if (length > *count)
{
*count = length;
ret = tmp;
}
return ret;
}
int main()
{
char str[80] = { 0 };
gets(str);
int count = 0;
int start = Max_word(str, &count);
for (int i = start, j = 0; j < count; j++, i++)
{
printf("%c", str[i]);
}
return 0;
}
69. 输入10个学生5门课程的成绩,分别用函数实现以下功能(p216)
- 计算每个学生的平均分
- 计算每门课程的平均分
- 找出所有50个分数中最高的分数所对应的学生和课程
- 计算每个学生平均分的方差
#include<stdio.h>
#define M 2
#define N 5
//计算每个人的平均分
void student_ave(float arr[M][N], float ave[N])
{
int i = 0;
for (i = 0; i < M; i++)
{
float sum = 0;
int j = 0;
for (j = 0; j < N; j++)
{
sum += arr[i][j];
}
ave[i] = sum / N;
printf("Num %d: average score = %.2f\n", i+1, ave[i]);
}
printf("\n");
}
//计算每门课程平均分
void lesson_ave(float arr[M][N])
{
int i = 0;
int j = 0;
for (i = 0; i < N; i++)
{
float sum = 0;
for (j = 0; j < M; j++)
{
sum += arr[j][i];
}
printf("lesson%d average:%.2f\n", i + 1, sum / M);
}
printf("\n");
}
//找出所有课程中最大的分数及其学生、课程名
void findmax(float arr[M][N])
{
float max = arr[0][0];
int i = 0;
int j = 0;
int student = 0;
int course = 0;
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
if (arr[i][j] > max)
{
max = arr[i][j];
student = i; //记录名字
course = j; //记录课程
}
}
}
printf("max = %.2f student = %d course = %d\n", max, student+1, course+1);
}
//求平均分的方差
void s_s(float ave[N])
{
float sum_s = 0.0;
float sum = 0.0;
for (int i = 0; i < N; i++)
{
sum_s += ave[i] * ave[i];
sum += ave[i];
}
printf("方差是:%.2f\n", (sum_s / N) - ((sum / N) * (sum / N)));
}
int main()
{
float arr[M][N] = { 0 };
float ave_score[N] = { 0 };
int i = 0;
for (i = 0; i < M; i++)
{
int j = 0;
for (j = 0; j < N; j++)
{
scanf("%f", &arr[i][j]);
}
}
//计算每个学生平均分
student_ave(arr, ave_score);
lesson_ave(arr);
findmax(arr);
s_s(ave_score);
return 0;
}
70.进制转换,函数实现(p216)
十六进制转十进制
int convert(char* p)
{
int sum = 0;
while (*p != '\0')
{
if (*p >= 'A' && *p <= 'f')
{
sum = sum * 16 + *p - 'A' + 10;
}
else if (*p >= 'a' && *p <= 'f')
{
sum = sum * 16 + *p - 'a' + 10;
}
else if(*p >= '0' && *p <="9")
{
sum = sum * 16 + (*p - '0');
}
p++;
}
return sum;
}
int main()
{
char str[10] = {0};
gets(str);
int sum = convert(str);
printf("%d\n", sum);
return 0;
}
十进制转十六进制
void convert(int num)
{
char arr[20] = { 0 };
int i = 0;
while (num != 0)
{
int tmp = num % 16;
if (tmp < 10)
{
arr[i] = tmp + 48;//0-->'0'
}
else
{
arr[i] = tmp + 55; //10-->‘A’
}
num = num / 16;
i++;
}
for(int j = i - 1; j >= 0; j--)
{
printf("%c", arr[j]);
}
}
int main()
{
int num = 0;
scanf("%d", &num);
convert(num);
return 0;
}
十进制转八进制
- 函数无返回值,直接打印
void convert(int n)
{
if (n)
{
convert(n / 8);
printf("%d", n % 8);
}
}
int main()
{
int num = 0;
scanf("%d", &num);
convert(num);
return 0;
}
- 函数有返回值
int convert(int decimalNum)
{
int Oct = 0;
int i = 1;
while (decimalNum != 0)
{
Oct += (decimalNum % 8) * i;
decimalNum = decimalNum / 8;
i = i * 10;
}
return Oct;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = convert(num);
printf("%d\n", ret);
return 0;
}
- 递归
int to_oct3(int num)
{
int sum = 0;
if (num)
{
sum = to_oct3(num / 8) * 10 +(num % 8);
}
return sum;
}
十进制转二进制
- 递归 有返回值
int convert(int n)
{
int sum = 0;
if (n)
{
sum = convert(n / 2) * 10 + (n % 2);
}
return sum;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = convert(num);
printf("%d\n", ret);
return 0;
}
- 递归,直接打印
void to_two3(int num)
{
if (num)
{
to_two3(num / 2);
printf("%d", num % 2);
}
}
- 循环
int convert(int num)
{
int sum = 0;
int i = 1;
while (num != 0)
{
sum += (num % 2) * i;
num = num / 2;
i = i * 10;
}
return sum;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = convert(num);
printf("%d\n", ret);
return 0;
}
八进制转十进制
循环
int octalToDecimal(int octal) {
int decimal = 0;
int power = 1;//权重转换
while (octal != 0) {
decimal += (octal % 10) *power;
octal /= 10;
power*=8;
}
return decimal;
}
int main() {
int octal;
printf("请输入一个八进制数:");
scanf("%d", &octal);
int decimal = octalToDecimal(octal);
printf("转换后的十进制数为:%d\n", decimal);
return 0;
}
递归
int octToDec(int oct, int power) {
if (oct == 0) {
return 0;
} else {
int digit = oct % 10;
return digit * power + octToDec(oct / 10, power * 8);
}
}
int main() {
int octal;
printf("请输入一个8进制数:");
scanf("%d", &octal);
int decimal = octToDec(octal, 1);
printf("转换为10进制为:%d\n", decimal);
return 0;
}
二进制转十进制
与八进制转十进制相同,只需将权重转换变为2
70.0-7所能组成奇数的个数
71.用递归法将一个整数n转换为字符串(p216)
void convert(int n)
{
if (n / 10 != 0)
{
convert(n / 10);
}
putchar(n % 10 + '0');
}
int main()
{
int n = 0;
scanf("%d", &n);
if (n < 0)
{
putchar('-');
n = -n;
}
convert(n);
return 0;
}
72.给出年月日,计算该日是该年的第几天(p216)
int sum_day(int year, int month, int day)
{
int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int sum = day;//先加该月的天数
for (int i = 1; i < month; i++)
{
sum += arr[i];
}
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//闰年
{
if (month > 2)//月份大于2
{
sum++;
}
}
return sum;
}
int main()
{
int year, month, day;
scanf("%d %d %d", &year, &month, &day);
int ret = sum_day(year, month, day);
printf("%d\n", ret);
return 0;
}
第八章(均使用指针)
73.删除出现在a串中的b串中的元素
void func(char* s1, char* s2)
{
char* ps1 = s1;
char* ps2;
while (*s1 != '\0')
{
ps2 = s2;//每次将串从头遍历
while (*ps2 && (*ps2 != *s1))
{
ps2++; //若两串没有相同的,则一直遍历,直到到达串尾
}
if (*ps2 == '\0')//因为遍历到末尾结束
{
*ps1 = *s1;//s1当前字符不再s2中
ps1++;
}
s1++;
}
*ps1 = '\0';
}
int main()
{
char str1[50] = "abcaa63akdfk";
char str2[20] = "ayk5";
func(str1, str2);
printf("%s\n", str1);//bc63df
return 0;
}
74.按由大到小顺序输出两数,指针实现(p227)
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
if (a < b)
{
swap(&a, &b);
}
printf("max = %d, min = %d\n", a, b);
return 0;
}
75.使用指针将n个整数按相反顺序存放(p242)
void reverse(int* arr, int num)
{
int n = num / 2;
int* left = arr;
int* right = arr + num - 1;
for (int i = 0; i < n; i++)
{
int tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
reverse(arr, 10);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
76. 输入三个字符串,由小到大输出(p291)
#include<string.h>
void swap(char* s1, char* s2)
{
char str[20] = { 0 };
strcpy(str, s1);
strcpy(s1, s2);
strcpy(s2, str);
}
int main()
{
char str1[20] = { 0 };
char str2[20] = { 0 };
char str3[20] = { 0 };
gets(str1);
gets(str2);
gets(str3);
if (strcmp(str1, str2) > 0)
swap(str1, str2);
if (strcmp(str1, str3) > 0)
swap(str1, str3);
if (strcmp(str2, str3) > 0)
swap(str2, str3);
printf("%s %s %s\n", str1, str2, str3);
return 0;
}
77.输入10个数,将最小数与第一个交换,最大数与最后一个交换(p291)
void exchange(int* arr, int n)
{
int i;
int max=s[0];
int a=0;
for(i=0;i<n;i++)
{
if(s[i]>max)
{
max=s[i];
a=i;
}
}
s[a]=s[0];
s[0]=max;
int j;
int min=s[0];
int b=0;
for(j=0;j<n;j++)
{
if(s[j]<min)
{
min=s[j];
b=j;
}
}
s[b]=s[n-1];
s[n-1]=min;
}
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
exchange(arr, 10);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
78.n个整数,使前面各数向后移动m个位置,最后m个数变成最前面m个数(p291)
其实就是左旋
void rotate(int* parr, int m, int n)
{
for (int j = 0; j < m; j++)
{
int tmp = *(parr + n - 1);
//旋转一次
for (int i = n - 1; i > 0; i--)
{
*(parr + i) = *(parr + i - 1);
}
//最后一个数放在前面
*parr = tmp;
}
}
int main()
{
int arr[10] = { 0 };
int i = 0;
int m = 3;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
rotate(arr, m, 10);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
79.n个人围一圈报数(p291)
int main()
{
int arr[100] = { 0 };//定义一个数组,存放每个人喊得数字
int count = 0;//几个人
scanf("%d", &count);
int digit = 1;//要喊得数字
int remain = count; //剩余人数
while (remain > 1) //还未找出赢家
{
for (int i = 1; i <= count; i++)
{
if (*(arr+i) == 3)
{
continue;//当前位置是3,跳过
}
*(arr + i) = digit;
if (digit == 3)//喊完3就要喊1了,又因为下面还有个++,所以赋值为0
{
digit = 0;
remain--;//剩余人数-1
}
digit++;
}
}
for (int j = 1; j <= count; j++)
{
if (*(arr + j) != 3)
{
printf("%d\n", j);
break;
}
}
return 0;
}
80.写一个函数,求字符串的长度(p291)
int my_strlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char* str = "abcdef";
printf("%d\n", my_strlen(str));
return 0;
}
81.从该字符串的第m的字符开始,全部复制到另一个字符串中(p291)
void my_m_strcpy(char* str1, char* str2, int m)
{
//字符从1开始
int count = 1;
while (count < m - 1)
{
count++;
str1++;
}
while (*str1 != '\0')
{
*str2 = *str1;
str2++;
str1++;
}
*str2 = '\0';
}
int main()
{
char str1[20] = "hello world";
char str2[20] = { 0 };
int m = 0;
scanf("%d", &m);
my_m_strcpy(str1, str2, m);
printf("%s\n", str2);
return 0;
}
82.输入一行字符串,统计大小写字母、数字、空格和其它字符的个数(p291)
int main()
{
int upc = 0;
int lowc = 0;
int digit = 0;
int space = 0;
int other = 0;
char str[50] = { 0 };
gets(str);
char* p = str;
while (*p != '\0')
{
if (*p >= 'A' && *p <= 'Z')
{
upc++;
}
else if (*p >= 'a' && *p <= 'z')
{
lowc++;
}
else if(*p >= '0' && *p <= '9')
{
digit++;
}
else if (*p == ' ')
{
space++;
}
else
{
other++;
}
p++;
}
printf("%d %d %d %d %d\n", upc, lowc, digit, space, other);
return 0;
}
83.写一个函数,转置矩阵(p291)
void move1(int* parr)
{
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = i; j < 3; j++)
{
int tmp = 0;
tmp = *(parr + 3 * i + j);
*(parr + 3 * i + j) = *(parr + 3 * j + i);
*(parr + 3 * j + i) = tmp;
}
}
}
void move2(int (*parr)[3])
{
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
//此处应该是j=i,否则就会交换两次,变回原型了
for (j = i; j < 3; j++)
{
int tmp = 0;
tmp = *(*(parr + i) + j);
*(*(parr + i) + j) = *(*(parr + j) + i);
*(*(parr + j) + i) = tmp;
}
}
}
int main()
{
int arr[3][3] = { 1,2,3,1,2,3,1,2,3};
move1(&arr[0][0]); //普通指针,注意传的是第一个元素的地址
//int(*p)[3] = arr; //数组指针
//move2(p);
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
84. 5×5数组,将最大值放在中间位置,4个最小值放在四个角上(p291)
void operation(int(*p)[5], int row, int col)
{
//一、找最大值
//为了不记录最大值的下标,此处使用指针更加方便
int* mid =&p[row / 2][col/2];
int* max = &p[0][0];
//1.找最大值
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (*max < p[i][j])
{
max = &p[i][j];
}
}
}
//2.找到最大值,交换
int tmp = *mid;
*mid = *max;
*max = tmp;
//二、找四个最小值
//1.记录由四个角的位置
int* corner[4] = { &p[0][0], &p[0][col - 1],&p[row-1][0], &p[row-1][col-1] };
//2.遍历数组,寻找最小值
for (int k = 0; k < 4; k++)//需要寻找四次
{
int* min = mid; //每次都要将最小值初始化为数组的最大值
for (int n = 0; n < row; n++)
{
for (int m = 0; m < col; m++)
{
//3.判断该位置是否是角落位置
int t = 0;
for (t = 0; t < k; t++)
{
//找第0个最小数的时候,k=0,意味着没有角落被交换
if (&p[n][m] == corner[t])
{
break;
}
}
if (t != k) //说明是break出来的,该位置已经被交换过了,不需要交换了
{
continue;//
}
if (*min > p[n][m])
{
min = &p[n][m];
}
}
}
int tmp = *corner[k];
*corner[k] = *min;
*min =tmp;
}
}
int main()
{
int arr[5][5] =
{
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25},
};
operation(arr,5,5);
int i = 0;
for (i = 0; i < 5; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
85.10个字符串,对他们进行排序(p291)
void sort(char* *p, int count)
{
int i = 0;
for (i = 0; i < count-1; i++)
{
int j = 0;
for (j = 0; j < count - 1 - i; j++)
{
//由大到小排序
if (strcmp(*(p + j), *(p + j + 1)) < 0)
{
char* tmp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = tmp;
}
}
}
}
int main()
{
int i = 0;
char str[10][20] = { 0 };
char* arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
//指针数组要想初始化,必须先有一个数组
scanf("%s", str[i]);
arr[i] = str[i];
}
sort(arr, 10);
for (i = 0; i < 10; i++)
{
printf("%s\n", arr[i]);
}
return 0;
}
86.逆序10个数(p291)
void reverse(int* arr, int count)
{
int* left = arr;
int* right = arr + count - 1;
while (left < right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
reverse(arr, 10);
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
87.写三个函数,实现以下功能(数组实现)
4个学生,5门课程
- 求一门课程的平均分
- 找出有两门以上课程不及格的学生,打印出信息
- 找出平均成绩在90分或全部课程在85分以上的学生,记为优秀
void average_lesson(int arr[4][5], int n)
{
if (n <= 0 || n >5)
{
return;
}
double sum = 0;
for (int i = 0; i < 4; i++)
{
sum += arr[i][n - 1];
}
printf("第%d门课程的平均分是:%.1lf\n", n, sum / 4);
}
void find_bad(int arr[][5])
{
for (int i = 0; i < 4; i++)
{
int count = 0;
for (int j = 0; j < 5; j++)
{
if (arr[i][j] < 60)
{
count++;
}
}
if (count > 2)
{
printf("第%d名学生有两门以上成绩不及格\n", i + 1);
}
}
}
void find_good(int arr[4][5])
{
for (int i = 0; i < 4; i++)
{
double sum = 0;
int count = 0;
for (int j = 0; j < 5; j++)
{
sum += arr[i][j];
if (arr[i][j] >= 85)
{
count++;
}
}
double ave = sum / 5;
if (ave > 90 || count == 5)
{
printf("第%d名学生位优秀\n", i + 1);
}
}
}
int main()
{
int arr[4][5] = { 0 };
printf("请输入每名学生的成绩:\n");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
scanf("%d", &arr[i][j]);
}
}
printf("求第几门课程的平均分?\n");
int n = 0;
scanf("%d", &n);
average_lesson(arr, n);
find_bad(arr);
find_good(arr);
return 0;
}
88.输入一个字符串,统计其中连续数字的个数,并将数字放在一个数组中
int main()
{
char str[100] = { 0 };
char a[10][100] = { 0 };
gets(str);
char* ptr = str;
int row = 0;
int col = 0;
while (*ptr != '\0')
{
//当前字符是数字,开始读取数字字符串
if (*ptr >= '0' && *ptr <= '9')
{
while (*ptr >= '0' && *ptr <= '9' && *ptr != '\0')
{
//连续存储一个数字字符串
a[row][col] = *ptr;
col++;
ptr++;
}
a[row][col] = '\0';
//来到这里,说明非数字字符或者\0
//1.非数字字符,开始存储下一个数字字符串
row++;
col = 0;
//2.若是\0,跳出循环,停止访问,以防止越界
if (*ptr == '\0')
{
break;
}
}
//不是字符串,指针后移
else
{
ptr++;
}
}
printf("%d个数字\n", row);
for (int i = 0; i < row; i++)
{
printf("%s\n", a[i]);
}
return 0;
}
89.输入月份,输出对应的英文单词,使用指针数组处理
int main()
{
char* arr[13] = { NULL,"January","February","March","April","May",
"June","July","August","Septembet","October","November","December" };
int month = 0;
scanf("%d", &month);
if (month >= 1 && month <= 12)
{
printf("%s\n", arr[month]);
}
else
{
printf("illegal input\n");
}
return 0;
}
自己遇到的其它题目
90.数9的个数
编写程序数一下 1到 100 的所有整数中出现多少个数字9
int main()
{
int count = 0;
int i = 0;
for (i = 1; i <= 100; i++)
{
//十位数为9 90,91,92.....
if (i / 10 == 9)
{
count++;
}
//个位数为9 9,19,29.....
if (i % 10 == 9)
{
count++;
}
}
printf("%d\n", count);//20
return 0;
}
91.打印1-100000水仙花数
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i < 100000; i++)
{
int tmp = i;
int n = 1;
int sum = 0;
//求位数
while (tmp > 9)
{
n++;
tmp /= 10;
}
tmp = i;
while (tmp)
{
sum += (int)pow(tmp % 10, n);
tmp /= 10;
}
if (sum == i)
{
printf("%d ", i);
}
}
return 0;
}
92.递归实现n的k次方
int Pow(int n, int k)
{
if (k == 0)
{
return 1;
}
return n * Pow(n, k - 1);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
int ret = Pow(n, k);
printf("%d\n", ret);
return 0;
}
93.青蛙跳台阶
一只青蛙跳一次只能跳1级台阶或跳2级台阶。
求:该青蛙跳上第n级台阶总共有多少种跳法?
例如:青蛙想跳至第二级台阶可以有两种跳法,一种是先跳一级再跳一级,另一种是直接跳两级台阶。
递归
#include<stdio.h>
int func(int n)
{
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return func1(n - 1) + func1(n - 2);
}
int main()
{
int x = 0;
scanf("%d", &x);
int ret = func(x);
printf("func(%d)=%d\n", x, ret);
return 0;
}
非递归
int func(int n)
{
int i = 1;
int j = 2;
int tmp = 0;
if (n == 1)
return i;
else if (n == 2)
return j;
else
{
while (n - 2)
{
tmp = i + j;
i = j;
j = tmp;
n--;
}
return tmp;
}
}
94.计算一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
int DigitSum(int n)
{
if (n < 10)
{
return n;
}
return (n % 10) + DigitSum(n / 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = DigitSum(n);
printf("%d\n", ret);
return 0;
}
95.字符串左旋
实现一个函数,可以左旋字符串中的k个字符
#include<string.h>
void leftRound(char* str, int time)
{
int i = 0;
int j = 0;
char tmp = 0;
int len = strlen(str);
time %= len;//长度为5的情况下,旋转6、11、16...次相当于1次,
//7、12、17...次相当于2次,以此类推。
for (i = 0; i < time; i++)
{
tmp = str[0];
for (j = 0; j < len - 1; j++)
{
str[j] = str[j + 1];
}
str[j] = tmp;
}
}
int main()
{
char str[] = "AABCD";
leftRound(str, 2);
printf("%s\n", str);
return 0;
}
96.变种水仙花数
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1461 + 1461 + 146*1
求出 5位数中的所有 Lily Number。
int main()
{
int i = 0;
int j = 0;
for (i = 10000; i < 100000; i++)
{
int tmp = i;
int sum = 0;
//99999
for (j = 10; j < 100000; j *= 10)
{
sum += (tmp / j) * (tmp % j);
}
if (sum == i)
{
printf("%d\n", i);
}
}
return 0;
}