1.代码
#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
if (b== 0)
return a;
return gcd(b, a % b);
}
int main()
{
int n;
int arr[100005];
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
sort(arr + 1, arr + 1 + n);
if (arr[1] ==arr[n])
{
cout << n << endl;
return 0;
}
int d = arr[2] - arr[1];
for (int i = 3; i <= n; i++)
{
d = gcd(d, arr[i] - arr[i - 1]);
}
cout << (arr[n] - arr[1]) / d + 1<<endl;
return 0;
}
2.思路
本题其实就是先从小到大按顺序排列之后,求各项之差的最大公约数,这里用的是递归的方法,差不多等同于辗转相除,不用去比较a,b大小,在b=0的时候函数内部循环结束,求出最大公约数a,最后用等差数列的思想即可求出项数
1.代码
#include<iostream>
using namespace std;
int power(long long a,long long b,long long p)
{
long long ans = 1;
while (b)
{
if (b % 2 == 1)
ans = ans * a % p;
b = b / 2;
a = a * a % p;
}
return ans;
}
int main()
{
long long a, b, p;
cin >> a >> b >> p;
cout << a << "^" << b << " mod " << p << "=";
cout << power(a, b, p);
}
2.思路
快速幂运算,分奇数情况与偶数情况,此题需要每次乘法完成后就取余,不会影响最终计算结果
1.代码
#include<iostream>
using namespace std;
int n;
int a[1000009];
int BiSearch(int x)
{
int left = 0, right = n - 1;
while (left <= right)
{
int middle = (left + right) / 2;
if (a[middle] == x)
return middle;
if (x > a[middle])
left = middle + 1;
else
right = middle - 1;
}
return -1;
}
int main()
{
int m, x;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < m; i++)
{
cin >> x;
cout << BiSearch(x) << " ";
}
return 0;
}
2.思路
二分法查找