2023/12/12
(1)题目描述:
写一个函数,判断100~200之间的所有素数。
代码如下:
#include
int main()
{
int i=0;
for(i=100;i<=200;i++)
{
int j=0;
int flag=1;
for(j=2;j
思路:
将100至200的数遍历从100除至200,如果期间除余为0,则j也是它的因数,说明它不是素数,反之则是素数。
优化:
#include
#include
int main()
{
int i=0;
for(i=101;i<=200;i+2)//素数只可能是奇数
{
int j=0;
int flag=1;
for(j=2;j
从这一题中所学的知识:
对于对素数的查找,可以确定素数一定是奇数,且因子只需要遍历至平方根位置即可,从而达到优化的效果。
12
12/13
题目描述:
第一行输入一个数值n,表示有n个数值,第二行输入n个数值各是多少
要求第一行输出去除重复数值后所剩的数值个数,第二行输出除去重复数值之后的数值,且从小到大排序。
样例输入:
10
20 40 32 67 40 20 89 300 400 15
样例输出:
8
15 20 32 40 67 89 300 400
代码如下:
#include
int main()
{
int N,i,j;
scanf("%d",&N);
int arr[N];
for(i=0;iarr[j+1])
{
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
int k=N;
for(i=0;i
思路:
先是使用冒泡排序对数组进行排序,输出时使用continue对重复的数据进行跳过,达到去重的目的。
12/14
题目描述:
有n盏灯,编号为1-n。第一个人把所有的灯打开,第2个人按下所有编号为2的倍数的开关(这些灯被灭掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,打开的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。
样例输入:
7 3
样例输出:
1 5 6 7
代码如下:
#include
int main()
{
int a[1000]={0};
int i,j,k,n;
scanf("%d %d",&n,&k);
a[1]=0;
for(i=2;i<=n;i++)
{
for(j=2;j<=k;j++)
{
if(j>i)
break;
if(i%j==0)
a[i]=(a[i]==1?0:1);
}
}
for(i=1;i<=n;i++)
{
if(a[i]==0)
printf("%d ",i);
}
return 0;
}
思路:
首先将编号用数组来表示,定义数组0为开,1为关;从题目意思可得,第一个灯永远都是开着的,即可直接定义a[1]=0;之后从第2个灯开始遍历,运用三目运算符进行对开关灯的翻转,最后输出结果。
从这一题中所学的知识:
三目运算符:if条件语句的简化版
基本形式:布尔表达式?表达式1:表达式2
原理:如果布尔表达式为真;则返回表达式1中的值;如果为假,则返回表达式2中的值
12/14
题目描述:
求C(N,M),即求M个数中选N个数的组合方案数
第一行一个正整数T(T<=10),表示有T组测试数据
样例输入
2
3 5
2 4
样例输出:
10
6
代码如下:
#include
int fact(int n)
{
int i;
int sum=1;
for(i=1;i<=n;i++)
{
sum*=i;
}
return sum;
}
int main()
{
int j,N,M,T;
scanf("%d",&T);
int result;
for(j=0;j
思路:
思路很简单,主要需要注意的是一个数学知识:C(N,M)=M!/(N!*(M-N))!)
12/15
今日所学知识:
高精度加法的运算:用于处理很大的数相加,如几百位数的相加
在C/C++中,经常会碰到限定数据范围的情况,但是C++中标准规定int占一个机器字长。在32位系统中int占32位,即4个字节,所以int的范围是[-2^31,2^31-1],为10^9数量级;long long的范围则是[-2^63,2^63-1],数量级为10^18,超过该数量级则需要使用高精度算法。
核心:竖式计算
具体思路