素数与最大公约数GCD:

题目一: 

#include <climits>
#include <cmath>
#include <iostream>
using namespace std;
#include<vector>
#include<algorithm>
int main() {
  int n;
  cin>>n;
  vector<vector<int>>v(n,vector<int>(2));
  //数组队中最小值
  int m=INT_MAX;
  for(int i=0;i<n;i++)
  {
    cin>>v[i][0]>>v[i][1];
    m=min(m,min(v[i][0],v[i][1]));
  }

  vector<int>s;
  vector<int>tmp(sqrt(pow(10,9)*2),1);
  for(int i=2;i<tmp.size();i++)//i为素数值,将合适的i插入数组
  {
    if(tmp[i]==1)s.push_back(i);
    for(int j=i*i;j<tmp.size();j+=i)
    {
        tmp[j]=0;
    }
  }

  auto it=lower_bound(s.begin(), s.end(),m);//找到素数中大于等于m的值
  if(it==s.end())return -1;
  int i;
  while(it>=s.begin())
  {
    for(i=0;i<n;i++)
    {
        if(v[i][0]%*it!=0&&v[i][1]%*it!=0)break;
    }
    if(i==n)break;
    it--;
  }
  cout<< (i==n?*it:-1)<<endl;
  return 0;
}
// 64 位输出请用 printf("%lld")

解题思路:

首先得到范围内的所有素数集合,由输入的数对得到其中最小的值,在素数数组中查找大于等于最小值的素数,由该素数判断是否可以整除每组数对中至少一个的数据,全部满足则输出该素数,不满足则素数减小一个继续判断,直到到达结束判断的条件输出-1;

题目二:

#include <iostream>
#include <string>
using namespace std;
#include<vector>

int main()
{
	vector<int>s(sqrt(2 * pow(10, 5)), 1);
	vector<int>ss;
	//a、b最大2*10^9 
	for (int i = 2; i < s.size(); i++)
	{
		if (s[i])
			ss.push_back(i);
		for (int j = i * i; j < s.size(); j += i)
		{
			s[j] = 0;
		}
	}
	// for (auto it : ss)cout << it << " ";
	int n;
	cin >> n;
	vector<int>v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}
	for (int i = 0; i < v.size(); i++)
	{
		for (int j = 0; j < ss.size(); j++)
		{
			if (v[i] % ss[j] == 0)
			{
				cout << (v[i] / ss[j]) << endl;
				break;
			}
		}
	}
	return 0;
}

解题思路:

由输入数据的最大值最小得到素数的范围,求得该范围上所有素数后,由原输入的整数,整除最小素数所得到的为最大公约数。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值