编程
一般都是c++1s的限制,python3S的限制。
1 输入一组正整数,求使得这组数的gcd为1的最少去掉元素的个数。
这个题主要考察求一组数的gcd。
https://blog.csdn.net/qq_44344649/article/details/88694401
用gcd()函数求出前两个数的最大公约数,用这两个数求得的这个最大公约数和后一位数求最大公约数,以此类推,最后求得一组数的最大公约数。最小公倍数可以用两个数相乘除以最大公约数来计算,这里就要用到上边的gcd()函数,通过循环,来求一组数的最小公倍数和最大公约数一样的道理。
比如4,6,9,前两个数的gcd为2,2和9的gcd为1,所以就是1了。
/*
* @Author: lenovouser
* @Date: 2020-08-11 19:04:00
* @Last Modified by: lenovouser
* @Last Modified time: 2020-08-11 19:07:09
*/
#include <iostream>
#include<vector>
#include <algorithm>
using namespace std;
int gcd(int a,int b)
{
int temp;
while(b!=0)
{
temp=a%b;
a=b;
b=temp;//辗转相除法
}
return a;
}
int main(int argc, char const *argv[])
{
int n;
cin>>n;
int v[n];
for (int i = 0; i < n; ++i)
{
cin>>v[i];
}
sort(v,v+n);
//unique(v,v+n);
if (v[0]==1)
{
cout<<0;
}
else
{
int g=gcd(v[0],v[1]);
if (g!=1)
{
for (int i = 2; i < n; ++i)
{
g=gcd(g,v[i]);
if (g==1)
{
cout<<0;
return 0;
}
}
cout<<-1;
}
else
{
cout<<0;
}
}
return 0;
}
这个其实也不难,如果最小的值为1,那么直接返回0,如果最小的和次小的gcd为1,那么后面肯定都为1了,可以直接确定返回0,然后如果中间结果为1,直接返回0,这个返回的结果其实不是0就是-1,就没有其它的值。
2 输入正整数a,b求a mod k=b的k的个数。
/*
* @Author: lenovouser
* @Date: 2020-08-11 19:35:27
* @Last Modified by: lenovouser
* @Last Modified time: 2020-08-11 20:01:11
*/
#include <iostream>
#include <cmath>
using namespace std;
int main(int argc, char const *argv[])
{
/* code */
int a,b;
cin>>a>>b;
if (a==b)
{
cout<<"inf";
return 0;
}
else
{
if (a<b)
{
cout<<0;
return 0;
}
else
{
if (b==0)
{
int n=0;
for (int i = 1; i <=floor(sqrt(a)); ++i)
{
if (a % i==0)
{
if (i==ceil(sqrt(a)))
n++;
else
n+=2;
}
}
cout<<n;
return 0;
}
else
{
int n=0;
for (int i =1; i <=floor(sqrt(a-b)); ++i)
{
if ((a-b) % i==0)
{
if (i==ceil(sqrt(a-b)) && i>=b+1)
n++;
else
{
if (i>=b+1 && (a-b)/i>=b+1)
{
n+=2;
}
else
{
if (i<b+1 && (a-b)/i<b+1);
else n++;
}
}
}
}
cout<<n;
return 0;
}
}
}
return 0;
}