编程题汇总
目录
1、BC18 计算带余除法
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("%d %d", a / b, a % b);
return 0;
}
2、BC41 你是天才吗?
#include <stdio.h>
int main()
{
int a = 0;
//多组输入
while (scanf("%d", &a) != EOF)
{
if (a >= 140)
{
printf("Genius\n");
}
}
return 0;
}
3、BC49 判断两个数的大小关系
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
//多组输入
while (scanf("%d %d", &a, &b) != EOF)
{
if (a > b)
{
printf("%d>%d\n", a, b);
}
else if (a < b)
{
printf("%d<%d\n", a, b);
}
else
{
printf("%d=%d\n", a, b);
}
}
return 0;
}
4、BC83 被5整除问题
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 5 == 0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
5、BC56 线段图案
#include <stdio.h>
int main()
{
int a = 0;
while (scanf("%d", &a) != EOF)
{
for (int i = 1; i <= a; i++)
{
printf("*");
}
printf("\n");
}
return 0;
}
6、打印3的倍数的数
描述:写一个代码打印1-100之间所有3的倍数的数字
//方法1
#include <stdio.h>
int main()
{
int a = 0;
for (a = 1; a <= 100; a++)
{
if (a % 3 == 0)
{
printf("%d ", a);
}
}
return 0;
}
//方法2 - 简洁
#include <stdio.h>
int main()
{
int a = 0;
for (a = 3; a <= 100; a+=3)
{
printf("%d ", a);
}
return 0;
}
7、从大到小输出
写代码将三个整数数按从大到小输出。
例如:
输入:2 3 1
输出:3 2 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d%d%d", &a, &b, &c);
//比较3个数的大小
if (a < b)
{
int tmp = a;
a = b;
b = tmp;
}//a >= b
if (a < c)
{
int tmp = a;
a = c;
c = tmp;
}//a >= c
if (b < c)
{
int tmp = b;
b = c;
c = tmp;
}//c >= b
printf("%d %d %d", a, b, c);
return 0;
}
总结:从大到小输出,就是比较谁大,谁大就在最前面,谁小就在最后面。
8、BC51 三角形判断
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
while (scanf("%d %d %d", &a, &b, &c) != EOF)
{
//任意2边之和大于第3边,就可以构成三角形
if ((a + b) > c && (a +c) > b && (b + c) > a) //满足三角形的3种条件
{
//三角形的3种情况
if (a == b && b == c)
{
printf("Equilateral triangle!\n");
}
else if ((a == b) && (b != c) || (a == c) && (b != c) || (b == c) && (a != c))
{
printf("Isosceles triangle!\n");
}
else
{
printf("Ordinary triangle!\n");
}
}
else //不是三角形
{
printf("Not a triangle!\n");
}
}
return 0;
}
9、分数求和
内容:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
#include <stdio.h>
int main()
{
double sum = 0.0;
int flag = 1;
for (int i = 1; i <= 100; i++)
{
sum = sum + 1.0 * flag / i;
flag = -flag;
}
printf("%lf\n", sum);
return 0;
}
总结:
1、不要让结果永远为1的解决办法是,将分子改为小数(double/float类型)
2、使用flag(也可以是其他命名)实现正负交替
10、数9的个数
内容:编写程序数一下 1到 100 的所有整数中出现多少个数字9
知识点:for循环、if语句、自增的单目操作符++、if...else...
思路:
9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99 ---20个
99是特殊的,它有2个
先观察一下,9出现的位置,个位和十位
个位如何求?十位如何求?
个位:19 % 10 == 9
十位:99 / 10 == 9
因为题目是记个数,所以每成功计算一个就用count++记一下(前面要int count = 0;)
#include <stdio.h>
int main()
{
int count = 0;
for (int i = 1; i <= 100; i++)
{
//99走一次
if (i % 10 == 9)
{
count++;
}
//99走二次
if (i / 10 == 9)
{
count++;
}
}
printf("%d\n", count);
return 0;
}
如果在if...if之间加个else,就成了单分支,结果也会发生变化
这时,求的就是有多少个数字包含9
#include <stdio.h>
int main()
{
int count = 0;
for (int i = 1; i <= 100; i++)
{
//单分支:如果走了第一个if,就不能走第二个if。如果喜欢ta,就不能喜欢我了。
if (i % 10 == 9)
{
count++;
}
else if (i / 10 == 9)
{
count++;
}
}
printf("%d\n", count);
return 0;
}
11、打印闰年
内容:打印1000年到2000年之间的闰年
知识点:for循环、if语句、算数操作符%、逻辑操作符&& ||、赋值操作符==
思路:
闰年的条件是什么?
1.能被4整除,但不能被100整除
2.能被400整除
1000-2000用for循环
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1000; i <= 2000; i++)
{
if ((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0))
{
printf("%d ", i);
}
}
return 0;
}
12、求最大值
内容:求10 个整数中最大值
知识点:数组创建、数组元素的编号(也叫下标)、for循环、if语句、关系操作符<、赋值操作符=
思路:
打擂台,一个一个去PK!
#include <stdio.h>
int main()
{
int arr[10] = { 2,3,4,6,7,5,2,0,20,8 };
int max = arr[0]; //假设arr[0]第一个元素是最大值
for (int i = 0; i < 10; i++)
{
if (max < arr[i]) //打擂台
{
max = arr[i]; //最终的胜者!
}
}
printf("%d\n", max);
return 0;
}
13、乘法口诀表
内容:在屏幕上输出9*9乘法口诀表
打印出来的效果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=4 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
.......
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
思路:
循环的嵌套
用for循环产生2个1-9的值,分为外层循环和内层循环
外层循环的值赋值给i,内层循环的值赋值给j
j的值放乘号的左边,i的值放乘号右边
观察每一行的最后一个都是两个相同的数字相乘,所以内层循环的判断表达式应该为j <= i,而不是j <= 9
#include <stdio.h>
int main()
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("\t%d*%d=%d ", j, i, j * i);
}
printf("\n");//每打印一行就换一行
}
return 0;
}
两个关键点:
j <= i(不是j <= 9)
j, i(j在前,i在后,而不是i, j)
14、最大公约数
内容:给定两个数,求这两个数的最大公约数
例如:
输入:20 40
输出:20
辗转相除法 ——> 求最大公约数
辗转相除法的基本原理:
假设a为20,b为40,余数为c
c = a % b
如果c = 0,那么最大公约数就为b
如果c != 0,那么就要再用b(除数)除以c(余数),重复此过程,直到余数为0,除数就是最大公约数
思路:
先创建2个变量a和b,将20和40,分别赋值给它们
然后再创建一个变量c,将a%b的余数赋值给它
如果c不等于0,就要再用b%c,重复此过程,直到余数为0,所以要用到while循环
接下来写while循环
循环内部先互换a和b的值(a=b;b=c;)
再用a%b,赋值给c
如果c为0,就不再循环,直接打印b(最大公约数)
//方法1
#include <stdio.h>
int main()
{
int a = 20;
int b = 40;
int c = a % b;//20
//如果c不等于0,则要继续算,可能是1次,也可能是多次,所以要用到while循环
while (c != 0)
{
//辗转相除法 —> 互换a和b的值
a = b;//除数 40
b = c;//余数 20
c = a % b;//0
}
printf("%d\n", b);
return 0;
}
//方法2
#include <stdio.h>
int main()
{
int a = 20;
int b = 40;
int c = a % b;//20
int r = 0;
//如果c不等于0,则要继续算,可能是1次,也可能是多次,所以要用到循环
while (r != 0)
{
r = b % c;//0
}
printf("%d\n", c);
return 0;
}
15、打印素数
内容:写一个代码:打印100~200之间的素数。
注:素数又称质数,只能被1和本身整除的数字。
思路:
需要用到嵌套循环
外层循环产生100-200之间的数值
然后再判断是否为素数
(素数判断举例:7,只有1和7才能被整除,还有2 3 4 5 6,就诶个去试除7,如果被整除,就不是素数,如果不被整除,就是素数,
所以是拿2~i-1的之间的数,依次去除i。)
如果2到i-1的值能整除i,那就不是素数
不能整除,就是素数
//试除法
#include <stdio.h>
int main()
{
for (int i = 100; i <= 200; i++)
{
//判断是否为素数
int flag = 1;//假设i是素数 作为一个标记值
for (int j = 2; j <= i - 1; j++)
{
if (i % j == 0)//证明不是素数
{
flag = 0;
break;
}
}
if (flag == 1)//是素数
{
printf("%d ", i);
}
}
return 0;
}
如果想要知道素数的总数有多少个呢?
#include <stdio.h>
int main()
{
//创建变量count
int count = 0;
for (int i = 100; i <= 200; i++)
{
//判断是否为素数
int flag = 1;//假设i是素数 作为一个标记值
for (int j = 2; j <= i - 1; j++)
{
if (i % j == 0)//证明不是素数
{
flag = 0;
break;
}
}
if (flag == 1)//是素数
{
printf("%d ", i);
//用count计数,每打印一次i,就+1
count++;
}
}
//最后打印count
printf("\ncount = %d\n", count);
return 0;
}
16、【一维数组】输入10个整数,求平均值
内容:编写一个程序,从用户输入中读取10个整数并存储在一个数组中。然后,计算并输出这些整数的平均值。
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
//输入10个整数
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
//遍历数组,将它们加起来
int sum = 0;
for (int i = 0; i < 10; i++)
{
sum += arr[i];
}
printf("sum = %d\n", sum);
//平均值为小数
double avg = sum * 1.0 / 10;
printf("avg = %0.2lf\n", avg);
return 0;
}
17、BC68 X形图案
碰到这种题,画图尤为重要。画完图,就找规律。
#include <stdio.h>
int main()
{
int a = 0;
while (scanf("%d", &a) != EOF)
{
//产生行
for (int i = 0; i < a; i++)
{
//产生列
for (int j = 0; j < a; j++)
{
//判断是否打印*
if (i == j || i + j == a - 1)
{
printf("*");
}
else
{
printf(" ");
}
}
//每一行遍历完就换一行
printf("\n");
}
}
return 0;
}
18、BC69 空心正方形图案
碰到这种题,画图尤为重要。画完图,就找规律。
#include <stdio.h>
int main()
{
int n = 0;
while (scanf("%d", &n) != EOF)
{
//产生行
for (int i = 0; i < n; i++)
{
//产生列
for (int j = 0; j < n; j++)
{
//判断是否打印*
if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
{
printf("* ");
}
else
{
printf(" ");
}
}
//每一行遍历完就换一行
printf("\n");
}
}
return 0;
}
19、BC107 矩阵转置
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
//可变数组
int arr[n][m];
//n行
for (int i = 0; i < n; i++)
{
//m列
for (int j = 0; j < m; j++)
{
//读入n行m列的数据
scanf("%d", &arr[i][j]);
}
}
//实现功能
//m行
for (int i = 0; i < m; i++)
{
//n列
for (int j = 0; j < n; j++)
{
printf("%d ", arr[j][i]);
}
printf("\n");
}
return 0;
}
20、BC92 逆序输出
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
//良好的编程习惯是:习惯初始这个数组
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for (int i = 9; i >= 0; i--) //注意是i--
{
printf("%d ", arr[i]);
}
return 0;
}
21、BC100 有序序列合并
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
//输入第一行
scanf("%d%d", &n, &m);
//数组的个数不超过1000
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
//输入第二行
for (int i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
//输入第三行
for (int i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//上述已经完成数组的输入
int i = 0;//遍历第一个数组
int j = 0;//遍历第二个数组
//第一种情况 都满足
while(i < n && j < m)
{
//比大小
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;//继续比较后面的数
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
//第二种情况 i>=n j<m
while(j < m)
{
printf("%d ", arr2[j]);
j++;
}
//第三种情况 j>=m i<n
while(i < n)
{
printf("%d ", arr1[i]);
i++;
}
return 0;
}
22、【一维数组】交换数组
内容:将数组A中的内容和数组B中的内容进行交换。(数组一样大)
#include <stdio.h>
int main()
{
int arrA[] = { 1,2,3,4 };
int arrB[] = { 5,6,7,8 };
//用sizeof计算数组元素个数
int len = sizeof(arrA) / sizeof(arrA[0]); //求数组的长度
//原来数组的内容
for (int i = 0; i < len; i++)
{
printf("%d ", arrA[i]);
}
printf("\n");
for (int i = 0; i < len; i++)
{
printf("%d ", arrB[i]);
}
printf("\n-------");
//A和B数组内容交换
for (int i = 0; i < len; i++)
{
int temp = arrA[i];
arrA[i] = arrB[i];
arrB[i] = temp;
}
printf("\n");
//交换后数组的内容
for (int i = 0; i < len; i++)
{
printf("%d ", arrA[i]);
}
printf("\n");
for (int i = 0; i < len; i++)
{
printf("%d ", arrB[i]);
}
return 0;
}