题目描述
由题目可以推出,最短的等差数列的公差应为给出的序列中各个数的最大公约数。
又因为要最短,所以只要产生的新的等差数列最大值为输入的数中的最大值即可。
就像题目样例中的20就是最大值,只需要将数列从输入的数中的最小值排列到20即可。
此外,(回想起高中数学从来没有考虑的题目条件)等差数列的公差可以为0.
但是我们有没有必要把每个数判断一下是否相等?没有,因为上面已经求出新的数列中的最大最小值,
也就是首项和末项,如果an-a1=0,那么an=a1,该数列为常数数列。
C++ 代码
//示例中最短的就是加上最大公约数
//然后的话,要最短,第一项就找最小那个数好了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 100010;
int N;
int ans;
ll arr[maxn];
ll num[maxn];//存放生成后的等差数列数组
int gcd(ll a,ll b){
if(b == 0) return a;
return gcd(b,a%b);
}
int main(){
scanf("%d",&N);
int min;
int max;
int temp;//找这一列数中的最大公约数
for(int i = 0; i < N; i++){
scanf("%lld",&arr[i]);
}
temp = gcd(arr[0],arr[1]);
min = arr[0];
max = arr[0];
for(int i = 1; i < N; i++){
if(max < arr[i]){
max = arr[i];
}
else if(min > arr[i]){
min = arr[i];
}
}
//实际上上面可以直接sort(arr,arr+N)就能找到最大最小值 一时间没想到
//等差数列的公差可能为0,没必要判断每一项相等,当最大与最小相等的时候就是d=0
if(max == min){
printf("%d",N);
return 0;
}
for(int i = 2; i < N; i++){
temp = gcd(temp,arr[i]);
}
int an = min;//从min加到max
ans++;//因为min算一项
while(sum != max){
an += temp;
ans++;
}
printf("%d",ans);
return 0;
}
??有没有大佬可以告诉我是不是一列整数的最大公约数,等于那列整数的差的最大公约数?(假设这列整数是符合等差数列的项的情况下)
看了下视频,发现自己是直接找的a1 a2 a3…an的最大公约数,为什么是和他们差的最大公约数相等的..2333我再算一下
那不是充要,像1,3,5,7,9,差的gcd是2,每个数的gcd是1
太强了
太强了
???为啥能蒙对
我好像是蒙中了....