一个和等差数有关的题

img

我自己写的又长又臭,oj还报错,已经做了好几天了,人都要没了

有两个问题,一是最大值要到987654321?二是p取值范围怎么从1到一万呢
另外,有测试用例的话请贴出来

#include <stdio.h>
int func(int n,int p,int *flag)
{
    int a[9],m=0,f;
    while(n>0)
    {
        if(n%10 == 0)
            return 0;
        a[m++] = n%10;
        n/=10;
    }
    if(a[0] + a[m-1] != p)
        return 0;
    for(int i=1;i<m;i++)
    {
        if(i==1)
            f = a[i] - a[i-1];
        else if(a[i]-a[i-1] != f)
            return 0;
    }
    if(a[0] < a[m-1])
        *flag = 1;
    return 1;
}

int main()
{
    int flag = -1,res;
    long long s1=0,s2=0;
    int p;
    scanf("%d",&p);
    for(int i=11;i<= 987654321;i++)
    {
        res = func(i,p,&flag);
        if(res == 1)
        {
            printf("%d ",i);
            if(flag == 1)
                s2+=i;
            s1+=i;
        }
    }
    printf("\n");
    if(s1==0 || s2==0)
        printf("-1,-1");
    else
        printf("%lld,%lld",s1,s2);
}

这不对吧,这不是呢喃的OJ吗?[doge]

p的有效范围应该是[3,17]

#include <stdio.h>
#include <math.h>

int Z(int x)
{
   if (x < 0) return -x;  
   else return x;
}
int main()
{
  int p,k;
  long long single,N,n,sum1,sum2;//N表示位数,single为个位上的数
  long long sum3 = 0;//首位>末位的数
  long long sum4 = 0;//首位<末位的数
  scanf("%d",&p);
  if(p < 3||p >= 18)
  {
      printf("%d %d",-1,-1);
      return 0;
  }
  if(p%2) k = (p-1)/2;
  else k = p/2;
    
  for(single = 1; single <= (int)k; single++)
  {
       if (p - single >= 10)
       continue;
       for(sum2 = 0,N = 2;N <= p - 2*single + 1;N++)//在确定个位数的情况下位数增加
      {
        if((double)Z(p - 2*single) / (N - 1) - Z(p - 2*single) / (N - 1))//判断公差是否为整数
            continue;
        sum1 = single;
        for(n = 1; n < N; n++){   //等差各项乘10^n相加
        sum1 += (single + n*(Z(p - 2*single)) / (N - 1))*pow(10,n);//Z(p - 2*single)是首位与末尾的差的绝对值
        }
        sum2 += sum1;
      }
    sum3 += sum2;
  }
  for(;single < p;single++)
  {
    if (single >= 10)
    break;
      for(sum2 = 0,N = 2;N <= Z(p - 2*single) + 1;N++)
      {
        if((double)Z(p - 2*single) / (N - 1) - Z(p - 2*single) / (N - 1))
            continue;
        sum1 = single;
        for(n = 1; n < N; n++){
        sum1 += (single - n*(Z(p - 2*single)) / (N - 1))*pow(10,n);
        }
        sum2 += sum1;
      }
    sum4 += sum2;
  } 
  printf("%lld %lld",sum3+sum4,sum3);
  return 0;
}

初学者,写得也比较冗长见谅,但是答案应该是符合要求的。