我自己写的又长又臭,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;
}
初学者,写得也比较冗长见谅,但是答案应该是符合要求的。