2019第十届蓝桥杯c语言B组省赛等差数列,一直显示运行错误,各位大佬能帮忙看看哪里错了吗
#include<stdio.h>#include<string.h> int find(int s[],int a,int n){ for(int i=0;i<n;i++) { //printf("a=%d ",a); //for(int j=0;j<n;j++) //printf("%d ",s[j]); if(s[i]>=a&&((s[i]%a)!=0)) return 0; else if(s[i]<a&&((a%s[i])!=0)) return 0; } return 1;} int main(){ int n; scanf("%d",&n); int a[100]; for(int i=0;i<n;i++) scanf("%d",&a[i]); //排序 int t; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } //求两两差值不同的个数 int b[100]; int count=n-1; for(int i=0;i<n-1;i++) { b[i]=a[i+1]-a[i]; } for(int i=0;i<n-2;i++) { for(int j=i+1;j<n-1;j++) { if(b[i]==b[j]) count--; } } //求约数个数 //printf("a[n]=%d,a[n-1]=%d,a[4]=%d,a[0]=%d ",a[n],a[n-1],a[4],a[0]); int x=a[n-1]-a[0]; //printf("x=%d ",x); int c[100]; int w=-1; for(int i=2;i<(x+1)/2;i++) { if(x%i==0) c[++w]=i; } //for(int i=0;i<w+1;i++) //printf("%d ",c[i]);//printf(" "); //求等差数列个数 int s[100],max=a[0]; int y=0,q; for(int i=0;i<w+1;i++) { int r=0; if(find(a,c[i],n)) { //printf("max+c[i]=%d ",max+c[i]); while(max!=a[n-1]) { r++; max=max+c[i]; q=1; } if(q=1) { s[y]=r+1; y++; q=0; } } } //for(int i=0;i<y;i++) //printf("%d ",s[i]);//printf(" "); //判断最小的个数 int min=s[0]; for(int i=1;i<y;i++) { if(min>s[i]) min=s[i]; } printf("%d",min); return 0;}
首先,逻辑上有明显的错
if(q=1) {
正确的肯定是
if(q==1) {
另外,经测试,算法上还是有问题的
数据范围也不对(你的a下标才100?)
网上有现成正确的,你参考下
#include<bits/stdc++.h> using namespace std; int Ai[100005]; int main(){ int N; cin>>N; for(int i = 0; i < N; i++) cin>>Ai[i]; sort(Ai, Ai + N); int min_d = Ai[1] - Ai[0]; //升序排的序,所以公差大于0 if(min_d == 0) //如果 Ai[1] - Ai[0]等于0,说明这些数必定全部相等,那最小值就是N cout<<N<<endl; else{ int gcd = min_d; for(int i = 2; i < N; i++){ min_d = __gcd(min_d, Ai[i] - Ai[i - 1]); } cout<<(Ai[N - 1] - Ai[0]) / min_d + 1<<endl; } return 0; }