A.求a到b之间存在多少个素数
对于这道题, 我们首先来了解一下什么是素数
素数的定义: 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数(质数)
知道了这个定义之后, 我们就可以来进行解题了
将区间端点读入之后, 我们需要依次判断区间内的每一个数是否是素数, 如果是, 则将记录素数个数的变量的值加一
显然, 这道题需要实现两个功能:
1、遍历区间中的每一个数
2、判断这个数是否是素数
AC代码如下
#include <stdio.h>
int main()
{
int l, r;
scanf("%d%d",&l,&r);
int ans = 0; //用于记录区间内素数的个数
for(int i = l; i <= r; i ++)
{
int f = 0; //f用来记录 i 在2到 i - 1之间因数的个数;
for(int j = 2; j < i; j ++)
{
if(i % j == 0) f ++;
}
if(f == 0) ans ++; //若 i 在2到i - 1之间没有因数, 则 i 为质数
}
printf("%d", ans);
return 0;
}
```
//以下为函数写法
#include <stdio.h>
int is_prime(int x)
{
for(int i = 2; i < x; i ++)
{
if(x % i == 0) return 0; //能被i整除, 说明x不是质数
}
return 1;
}
int main()
{
int l, r;
scanf("%d%d",&l,&r);
int ans = 0; //用于记录区间内素数的个数
for(int i = l; i <= r; i ++)
{
if(is_prime(i)) ans ++;
}
printf("%d", ans);
return 0;
}
B.从小到大输出三个整数
本题详解见:https://blog.csdn.net/qq_73208522/article/details/132117255 的1022
C.所在年第几天
本题的难点不在于题意的理解, 而在于正确代码的实现
这里我们讲一个易懂思路:
举个栗子: 如果我们读入的月份为12月, 说明前面11个月都已经过完了, 设当前日期为该年的第 x 天
则: x = 前11个月的天数 + 当前日期 (注意闰年的二月有29天)
于是, 我们可以利用switch的特性(如果碰不到break则一直向下执行语句)去实现这个操作, 具体代码实现如下:
#include <stdio.h>
int main()
{
int y,m,d;
scanf("%d %d %d",&y,&m,&d);
switch(m)
{
case 12:
d += 30; // 11月有30天
case 11:
d += 31; // 10月有31天
case 10:
d += 30; // 9月有30天, 下同理
case 9:
d += 31;
case 8:
d += 31;
case 7:
d += 30;
case 6:
d += 31;
case 5:
d += 30;
case 4:
d += 31;
case 3:
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
{
d += 29;
}else
{
d += 28;
}
case 2:
d += 31;
case 1:
printf("%d",d);
break;
}
return 0;
}
D.杨辉三角
如图, 杨辉三角第i行共i个数字, 其中最边缘数字为1, 其余数字为其左上方数字与其右上方数字之和
我们可以用二维数组来存储杨辉三角, for循环去遍历设置每一行的值, 对于每行, 其两端的值固定为1, 剩余数字对当前位置的左上方数字与右上方数字求和并赋值即可(设当前数字下标为(i, j), 则其左上方数字下标为(i - 1, j - 1), 右上方数字下标为(i - 1, j))
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[35][35];
int i, h;
for(i = 0; i < n; i ++)
{
a[i][0] = 1;
a[i][i] = 1;
for(h = 1; h < i; h ++)
{
a[i][h] = a[i - 1][h - 1] + a[i - 1][h];
}
}
for(i = 0; i < n; i ++)
{
for(h = 0; h <= i; h ++)
{
printf("%-8d",a[i][h]);
}
printf("\n");
}
return 0;
}