这是初步想法:
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
if(x%3==0&&x%5==0&&x%7==0)
{
printf("3 5 7");
}
else if(x%3==0&&x%5==0)
{
printf("3 5");
}
else if(x%5==0&&x%7==0)
{
printf("5 7");
}
else if(x%3==0&&x%7==0)
{
printf("3 7");
}
else if(x%3==0)
{
printf("3");
}
else if(x%5==0)
{
printf("5");
}
else if(x%7==0)
{
printf("7");
}
else
{
printf("n");
}
return 0;
}
我觉得这种方法太麻烦了,虽然这也是题解的方法,但是我相信可以有更好的方法的!
之后发现了一个很新颖的方法,使用了位运算和掩码:
#include <stdio.h>
int main()
{
int x,mask=0;
scanf("%d",&x);
if(x%3==0) mask |= 1;//001
if(x%5==0) mask |= 2;//010
if(x%7==0) mask |= 4;//100
switch(mask)
{
case 7://111
printf("3 5 7");
break;
case 3://011
printf("3 5");
break;
case 5://101
printf("3 7");
break;
case 6://110
printf("5 7");
break;
case 1://001
printf("3");
break;
case 2://010
printf("5");
break;
case 4://100
printf("7");
break;
default:
printf("n");
}
return 0;
}
第一次见到这种方法,长见识了。这种方法可以轻松地添加状态而不丢失之前的状态,特别适合处理多状态组合的问题!
但是代码依旧很长,有没有办法简化呢?
仔细一看!mask的值从0到7都有!那么可以使用数组来化简:
#include <stdio.h>
int main()
{
int x,mask=0;
const char *ans[]={"n","3","5","3 5","7","3 7","5 7","3 5 7"};
scanf("%d",&x);
if(x%3==0) mask |= 1;//001
if(x%5==0) mask |= 2;//010
if(x%7==0) mask |= 4;//100
printf("%s",ans[mask]);
return 0;
}
这么一看确实是简化了不少!
仔细想想,掩码的本质也就是加法,那么就可以把这对新手来说晦涩难懂的掩码给换成加法:
#include <stdio.h>
int main()
{
int x,mask=0;
const char *ans[]={"n","3","5","3 5","7","3 7","5 7","3 5 7"};
scanf("%d",&x);
if(x%3==0) mask++;
if(x%5==0) mask+=2;
if(x%7==0) mask+=4;
printf("%s",ans[mask]);
return 0;
}
你以为到这结束了?
还没完,掩码这一段略显复杂了一些,可以使用以掩码为原理的查表法来简化(本质是再次利用位运算来讲这三条式子合并):
#include <stdio.h>
int main()
{
int x=0;
const char *ans[]={"n","3","5","3 5","7","3 7","5 7","3 5 7"};
scanf("%d",&x);
int mask=(x%3==0)|((x%5==0)<<1)|((x%7==0)<<2);
printf("%s",ans[mask]);
return 0;
}
这就是我的最终版了,完成了题目,在OJ上也是100分。