H题
作者:互联网
H题最小互质数
题目描述
我们定义两个数的互质数当且仅当gcd(a, b) = 1。
现在L手里有n个数,分别为a1,a2,a3 ……an-1,an 。
问,没有在这n个数中出现过并且与这n个数都互质的最小的数是多少。
LL觉得这个问题太简单了,于是她把这个问题交给你来解决。
输入
第一行一个数n (1 ≤ n, ai ≤ 10^5)
接下来n行,每行一个数,分别代表a1,a2,a3 ……an-1,an 。
输出
输出一行代表答案
样例输入 Copy
5
1
2
3
4
5
样例输出 Copy
7
提示
没有在这n个数中出现的数有:6,7,……
6与2, 3, 4不互质,最小的与这n个数互质的数就是7了。
思路:先创建一个数组b[100005]将它们的值都初始化为0,找出所有的数n(ai除以这个数后余数为0)然后将b[n]赋值为1,完成后再把b[ai]也都赋值为1.在完成上述操作后就可以开始找最小的互质数,如果输入没有1,最小互质数就为1,如果有1就从i=2开始,如果i除以所有的b[n](如果b[n]>i则用b[n]除以i)最后的余数都不为0,那么i就是最小的互质数。
代码:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,a[100005],s=1,b[100005],flag=0;
scanf("%d",&n);
for(int i=1;i<=100005;i++)
b[i]=0;//将数组b中的值全部置0.
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]=1;//把输入过的数做标记。
}
for(int i=2;i<=n;i++)
if(a[i]>a[s])//找出数组a中的最大值。
s=i;
if(b[1]==0)//判断a数组中是否有1.
{
printf("1\n");//没有直接输出最小互质数1.
}
else
{
for(int i=2;i<=sqrt(a[s]);i++)//找出所有a数组中除得尽的数并作标记,这个数最大为a[s]开根号。
{
for(int j=1;j<=n;j++)
{
if(a[j]%i==0)
{
b[i]=1;//做标记。
break;
}
}
}
int i=2;
while(1)//找出最小互质数。
{
if(b[i]==0)
{
for(int j=2;j<=a[s];j++)
{
if(b[j]!=0)
{
if(i>=j&&i%j==0)
{
flag=1;
break;
}
if(i<j&&j%i==0)
{
flag=1;
break;
}
}
}
if(flag==0)
{
printf("%d\n",i);
break;
}
}
flag=0;
i++;
}
}
return 0;
}
标签:,int,互质数,个数,最小,break,flag 来源: https://blog.csdn.net/weixin_56002720/article/details/115678027