C语言 错题本
文章目录
- 旨在将遇到的不会的, 难的, 错的编程题目写下来, 然后通过刷错题的方式以掌握此题.
- 首先将错题弄懂, 可以是看视频讲解, 可以是网上查找资料, 也可以是问别人.
- 其次将错题写在此处, 并作一个标记, 即
7
, 表示的是第七天要再写一次此题. - 第七天可以顺利的完成, 此题就算是掌握了, 就可以将它作一个标记, 即
掌握
, 如果没能够完成, 那么就要再次弄懂它, 然后做上标记,21
, 在第二十一天的时候再写一遍. - 最后写完这题标记
掌握
.
7
7月11号
今天7月5号, 7月11号写此题
整数求逆–掌握
-
输入一个正整数, 输出逆序的数, 结尾的0逆序之后要求处理掉.
-
分析:
- 1.输入num
- 2.每次循环把最后一位取出来
- 3.剩余位重新赋值给num
- 4.将个个位数合成一个整数进行输出
- 5.进入循环的条件num>0
#include <stdio.h>
int main() {
//输入
int num;
scanf("%d", &num);
//每次循环把最后一位取出来
int ret = 0; //结果变量
while (num > 0) {
//表每一位的变量
int digit = 0;
digit = num % 10;
//剩余位重新赋值给num
num /= 10;
每次都将取出来的最后一位输出
//printf("%d", digit);
//让个个位数合成一个整数 // 123 1 2 3
// 0+3=3 3*10=30 30+2=32 32*10=320 320+1=321
ret += digit;
ret *= 10;
}
ret /= 10;
printf("%d ", ret);
return 0;
}
7月12号
今天7月6号, 7月12号写此题
求符合给定条件的整数集
-
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
- 输入格式:
输入在一行中给出A。 - 输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。 - 输入样例:
2 - 输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
- 输入格式:
水仙花数
-
水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。
例如:153 = 1^3 + 5^3+ 3^3。本题要求编写程序,计算所有N位水仙花数.- 输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。 - 输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。 - 输入样例:
3 - 输出样例:
153
370
371
407
- 输入格式:
打印九九口诀表–掌握
- 下面是一个完整的下三角九九口诀表:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
-
本题要求对任意给定的1位正整数N,输出从11到NN的部分口诀表。
- 输入格式:
输入在一行中给出一个正整数N(1<=N<=9)。 - 输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。 - 输入样例:
4 - 输出样例:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
- 输入格式:
-
分析:
- 1.输入n
- 2.定义循环控制变量i和j, i是外层循环, j是内层循环(外层循环在每行中是不变的, 而内层循环是递增的, 但是在内层循环做完之后, 外层循环就会自增1)
- 3.判断, 当i*j<=9时, 三个空格, >=10, 两个空格
#include <stdio.h>
int main() {
//输入n
int n;
scanf("%d", &n);
//外层循环
for (int i = 1; i <= n; i++) {
//内层循环控制变量初始化
int j = 1;
//内层循环
for (int j = 1; j <= i; j++) {
//每行中, 外层循环控制变量i是不变的, 而内层循环控制变量j是递增的
printf("%d*%d=%d", j, i, j * i);
//判断
if (j * i <= 9) {
printf(" ");
}
else if (j * i >= 10) {
printf(" ");
}
}
//外层循环循环一次, 则换行一次
printf("\n");
}
return 0;
}
统计素数并求和–掌握
-
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
- 输入格式:
输入在一行中给出2个正整数M和N(1<=M<=N<=500)。 - 输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。 - 输入样例:
10 31 - 输出样例:
7 143
- 输入格式:
-
分析:
- 1.输入mn
- 2.定义计数和求和变量
- 3.外层循环产生m到n之间的数
- 4.内层循环产生2到每次外层循环产生的这个数-1之间的数
- 5.在内层循环中, 每次让外层的那个数试除内层的这些数, 如果能除尽, 直接停止
- 6.如果内层的这些数试除完后都除不尽则说明这个数是素数, count++, sum += 这个数
#include <stdio.h>
int main() {
//输入mn
int m, n;
scanf("%d %d", &m, &n);
//计数和求和变量
int count = 0;
int sum = 0;
//外层循环产生m到n之间的数
//定义接收这些数的变量
int num1 = m;
while (num1 <= n) {
//判断素数的变量
int isPrime = 1;
//处理1
if (num1 == 1) {
isPrime = 0;
}
//内层循环产生2到num1-1之间的数
//接收这些数的变量
int num2 = 0;
for (num2 = 2; num2 < num1; num2++) {
//num1试除num2
if (num1 % num2 == 0) {
isPrime = 0;
break;
}
}
if (isPrime == 1) {
count++;
sum += num1;
}
num1++;
}
printf("%d %d", count, sum);
return 0;
}
7月13号
今天7月7号, 7月13号写此题
凑硬币
- 如何用一角两角和五角的硬币凑出10元以下的金额? 提示: 排列组合
前n项和(一加一减)–掌握
-
f(n) = 1/1 - 1/2 + 1/3 - 1/4 + … + 1/n
- 分析:
- 1.输入n
- 2.通项公式1/n
- 3.定义正负号变量sign和求和变量sum和结果变量ret
- 4.循环,产生1到n之间的数
- 5.每次让sum += 1/这些数*sign
- 6.每次让sign变一下正负号
- 分析:
#include <stdio.h>
int main() {
//输入n
int n;
scanf("%d", &n);
//定义变量
double sum = 0.0;
int sign = 1;
//循环产生1到n之间的数
for (int i = 1; i <= n; i++) {
sum += 1.0 / i * sign;
sign = -sign;
}
printf("f(%d) = %f", n, sum);
return 0;
}
最大公约数–掌握
- 输入两个数a和b,输出它们的最大公约数(是指两个或多个整数共有约数中最大的一个),提示:枚举法和辗转相除法
- 分析(辗转相除法):
- 1.输入a和b
- 2.b==0, 则a是gcd
- 3.否则, a%b = tmp
- 4.a=b 5.tmp=b
- 分析(辗转相除法):
#include <stdio.h>
int main() {
//输入
int a, b;
scanf("%d %d", &a, &b);
//循环
while (b != 0) {
int tmp = a % b;
a = b;
b = tmp;
}
printf("gcd = %d", a);
return 0;
}
7月14号
今天7月9号, 7月14号写此题, 因为周一休息, 所以改成周天写
正序整数分解–掌握
-
输入一个自然数, 正序输出它的每一位数字
- 输入: 13425
- 输出: 1 3 4 2 5
- 分析:
- 1.输入num
- 2.判断它是几位数count
- 3.循环count-1次, 每次ciMi*=10
- 4.循环, digit=num/ciMi, num%=ciMi, ciMi/=10
- 5.判断条件ciMi>0
- 6.输出digit
- 7.格式化, 判断
#include <stdio.h>
int main() {
//输入
int num;
scanf("%d", &num);
//判断num位数
int ciMi = 1;
int i = num; // 保留n的值
while (i >= 10) {
i /= 10;
ciMi *= 10;
}
//循环
while (ciMi > 0) {
//第一位
int digit = num / ciMi;
//剩余位
num %= ciMi;
//ciMi变量调整
ciMi /= 10;
printf("%d", digit);
//格式化
if (ciMi > 0) {
printf(" ");
}
}
return 0;
}
7月17号
今天7月11号, 7月17号写此题
简单计算器–掌握
-
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。
-
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。 -
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。 -
输入样例:
1+2*10-10/2= -
输出样例:
10 -
分析:
- 1.输入num1
- 2.循环输入c和num2
- 3.判断c的类型
- 4.循环条件c!=‘=’
- 5.对result和c和num2进行运算
- 6.异常处理
-
#include <stdio.h>
int main() {
//输入num1
int num1, num2;
scanf("%d", &num1);
//结果变量
int result = num1;
char c = 'a';
while (c != '=') {
//循环输入c
scanf("%c", &c);
//判断=
if (c == '=') {
break;
}
//输入num2
scanf("%d", &num2);
//异常处理变量
int error = 1;
//判断c的类型
if (c == '+') {
result += num2;
}
else if (c == '-') {
result -= num2;
}
else if (c == '*') {
result *= num2;
}
else if (c == '/') {
if (num2 == 0) {
printf("ERROR");
}
else result /= num2;
}
else {
printf("ERROR");
}
}
printf("%d", result);
return 0;
}
7月23号
今天是7月17号, 7月23号写此题
换个格式输出整数
-
让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。提示: 使用函数完成任务
-
输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。
-
输出格式:每个测试用例的输出占一行,用规定的格式输出n。
-
输入样例1:
234 -
输出样例1:
BBSSS1234 -
输入样例2:
23 -
输出样例2:
SS123
-
A+B和C–掌握
-
给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。
- 输入格式:
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。 - 输出格式:
对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。 - 输入样例:
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647 - 输出样例:
Case #1: false
Case #2: true
Case #3: true
Case #4: false - 分析:
- 1.输入t当作循环次数
- 2.每次循环输入abc
- 3.函数判断a+b是否>c
- 输入格式:
#include <stdio.h>
void daXiao(int a, int b, int c, int i);
int main(void) {
//输入t, 为循环次数
int t;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
//循环输入abc
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
//函数判断
daXiao(a, b, c, i);
}
return 0;
}
void daXiao(int a, int b, int c, int i) {
if (a + b > c) {
printf("Case #%d: true\n", i);
}
else {
printf("Case #%d: false\n", i);
}
}
7月24号
今天是7月18号, 7月24号写此题
判断素数的五种方法以及构造素数表
井字棋
7月25号
今天是7月19号, 7月25号写此题
求一批整数中出现最多的个位数字
-
给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
-
输入格式:
输入在第1行中给出正整数N(<=1000),在第2行中给出N个不超过整型范围的正整数,数字间以空格分隔。 -
输出格式:
在一行中按格式“M: n1 n2 …”输出,其中M是最大次数,n1、n2、……为出现次数最多的个位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。 -
输入样例:
3
1234 2345 3456 -
输出样例:
3: 3 4分析:
1.输入n 2.定义数组 3.
-
求矩阵的局部极大值
-
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
-
输入格式:
输入在第1行中给出矩阵A的行数M和列数N(3<=M,N<=20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。 -
输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。 -
输入样例1: 1.输入m和n 2.
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1 -
输出样例1:
9 2 3
5 3 2
5 3 4 -
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1 -
输出样例2:
None 3 5分析:
1.
-
组个最小数
-
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。现给定数字,请编写程序输出能够组成的最小的数。
- 输入格式:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。 - 输出格式:
在一行中输出能够组成的最小的数。 - 输入样例:
2 2 0 0 0 3 0 0 1 0 - 输出样例:
10015558
- 输入格式:
21
7月26号
今天是7月12号, 7月26号再次写此题, 也就是两个星期之后
求符合给定条件的整数集
-
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
- 输入格式:
输入在一行中给出A。 - 输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。 - 输入样例:
2 - 输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
- 输入格式:
水仙花数
-
水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。
例如:153 = 1^3 + 5^3+ 3^3。本题要求编写程序,计算所有N位水仙花数.- 输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。 - 输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。 - 输入样例:
3 - 输出样例:
153
370
371
407
- 输入格式:
7月27号
今天7月13号, 7月27号再次写此题, 也就是两个星期之后
凑硬币
- 如何用一角两角和五角的硬币凑出10元以下的金额? 提示: 排列组合
8月12号
今天是7月23号, 8月12号写此题
换个格式输出整数
-
让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。提示: 使用函数完成任务
-
输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。
-
输出格式:每个测试用例的输出占一行,用规定的格式输出n。
-
输入样例1:
234 -
输出样例1:
BBSSS1234 -
输入样例2:
23 -
输出样例2:
SS123
-