一个求1到1000数的阶乘和数 c!解决方案

一个求1到1000数的阶乘和数 c!
阶乘和数就是比如: 145为1!+4!+5!,那么145就是阶乘和数。编程题目就是求1到1000的阶乘和数,我的代码如下:
#include<stdio.h>
long jc(int x)
{
long s=1; int i,p;
for(i=1;i<=x;i++)
p*=i;
return(p);
}
main()
{
int i,j,v[2]={0},s=0;

for(j=1;j<1000;j++)
{
i=0;
while(j!=0)
{
v[i]=j%10;
j/=10;
i++;
}
s=jc(v[0])+jc(v[1])+jc(v[2]);
if(j==s) printf("%d ",j);
for(i=0;i<3;i++)
v[i]=0;
}

}
请指教!

------解决方案--------------------
你的代码有隐患和错误,另外效率也不高。
1. 隐患和错误
#include<stdio.h>
long jc(int x)
{
long s=1; 
int i,p = 1; /* 必须给p设初值,不然p是一个随机值。随机值*1*2...得到的结果还是一个随机值*/
for(i=1;i<=x;i++)
p*=i;
return(p);
}
int main() /* 给main添加一个返回值,如果不加,那么编译器默认main返回int。这不是一个好的编码习惯*/
{
int i,j,v[2]={0},s=0;
int iter = 1; /* 增加一个迭代器iter */

for(iter = 1; iter < 1000; iter++) /* 用iter来迭代 */
{
i=0;
j = iter; /* 将iter的值赋给j */
while(j!=0) /* 这个循环结束后,j肯定为0。因此,不能再将j作为外层循环的迭代器了。*/
{
v[i]=j%10;
j/=10; 
i++;
}
s=jc(v[0])+jc(v[1])+jc(v[2]);
if(iter==s) printf("%d ",iter); /* 不能比较j和s,而应比较iter和s。原因是j肯定为0,肯定不等于s。 */
for(i=0;i<3;i++)
v[i]=0;
}

return 0; /* 添加返回值,好的编程习惯 */
}
2. 效率不高
诚如3楼所说,完全没有必要循环迭代1000次啊。另外,只需要对9个数的阶乘1...9计算一次,把这9个结果存储下来就可以了。以后再用,直接用这9个已经计算好的结果就行。为什么要重复计算呢?。。。。