FOJ 1068 An Interesting Set

还是题意的理解。

最开始以为set集里面最大的值是500;

一直错。。

后来才发现是set里面的元素个数最多为500....

差了很多。。。。

 

方法是用打表的方法。

由于1-9必符合条件。

所以先添加到表中,由于10=5*2也是,也添加到表中。

11肯定不是了,那么就从12开始。

先判断i是否是表中已经有的元素*2,如果是,直接加入表中。

如果不是,再进行判断,是否各位数的和和各位数的乘积是否相等。

如果相等,也添加到表中。

 

原来判断 各位数的和和各位数的乘积是否相等 是转换成字符串来做。

原来想这样操作起来比较直观。但是后来发现要把set表打到有500个元素要好长时间。

只好改用运算的方法来做。

速度真的是天差地别呀!

 

#include <stdio.h> #include <string.h> int main() { int set[501]; int i,j; int a,b,c,d; int n,m; int num[10]; memset(set, 0, sizeof(set)); j = 1; for (i=1;i<=10;i++) { set[j] = i; j++; } int l=6; for (i=12;j<=500;i++) { if (i%2==0&&i==set[l]*2) { set[j] = i; j++; l++; } else { a=i;b=0; while(a>0) { num[b++]=a%10; a/=10; } c=0;d=1; for(a=0;a<b;a++) { c+=num[a]; d*=num[a]; } if(c==d) set[j++]=i; } } while (scanf("%d", &n) != EOF) { for (i=0;i<n;i++) { scanf("%d", &m); printf("%d/n", set[m]); } } return 0; }

你可能感兴趣的:(c,ini)