http://oj.ecustacm.cn/problem.php?id=1464
解析:
上图隐含的条件: i,j,k 为循环变量 i<j<k 或 i>j>k 避免重复
直接暴力
#include<cstdio>
bool judge(int n)
{
while(n)
{
int temp=n%10;
if(temp==2||temp==4)
return false;
n=n/10;
}
return true;
}
int main(void)
{
int i,j,k;
int c=0;
for(i=1;i<=2019;i++)
{
for(j=1;j<i;j++)
{
for(k=1;k<j;k++)
{
if(judge(i)&&judge(j)&&judge(k))
{
if(i!=j&&i!=k&&j!=k)
{
if(i+j+k==2019)
c++;
}
}
}
}
}
printf("%d\n",c);
return 0;
}
简化版,更容易理解,依次递增
#include<cstdio>
bool judge(int n)
{
while(n)
{
int temp=n%10;
if(temp==2||temp==4)
return false;
n=n/10;
}
return true;
}
int main(void)
{
int i,j,k;
int c=0;
for(i=1;i<=2019;i++)
{
for(j=i+1;j<=2019;j++)
{
for(k=j+1;k<=2019;k++)
{
if(judge(i)&&judge(j)&&judge(k))
{
if(i!=j&&i!=k&&j!=k)
{
if(i+j+k==2019)
c++;
}
}
}
}
}
printf("%d\n",c);
return 0;
}
精进一下: 3个数不相同,那么一定是一个递增的数列 2019/3=673
说明三个数中最小的数的取值范围为 1 ~ 673
#include<cstdio>
bool judge(int n)
{
while(n)
{
int temp=n%10;
if(temp==2||temp==4)
return false;
n=n/10;
}
return true;
}
int main(void)
{
int i,j,k;
int c=0;
for(i=1;i<=673;i++)
{
for(j=i+1;j<=2019;j++)
{
for(k=j+1;k<=2019;k++)
{
if(judge(i)&&judge(j)&&judge(k))
{
if(i!=j&&i!=k&&j!=k)
{
if(i+j+k==2019)
c++;
}
}
}
}
}
printf("%d\n",c);
return 0;
}
再在上一个的代码优化:
因为是一个递增的数列
故 i+j*2<2019 , k=2019-i-j
这样的话循环的次数大幅的减少。且不用判断 i+j+k==2019了
#include<cstdio>
bool judge(int n)
{
while(n)
{
int temp=n%10;
if(temp==2||temp==4)
return false;
n=n/10;
}
return true;
}
int main(void)
{
int i,j,k;
int c=0;
for(i=1;i<=673;i++)
{
for(j=i+1;j*2+i<2019;j++)
{
k=2019-i-j;
if(judge(i)&&judge(j)&&judge(k))
{
c++;
}
}
}
printf("%d\n",c);
return 0;
}