PKU POJ 1142 Smith Numbers 一道简单的题

PKU POJ 1142 Smith Numbers 一道简单的题

 

http://acm.pku.edu.cn/JudgeOnline/problem?id=1142 

以前就用pascal做过这道题,C再做一遍 

 1 #include  < stdio.h >  
 2 #include  < math.h >  
 3 #include  < memory.h >  
 4 long   int  re( long   int  a)               // re函数功能:返回一个数各位数字相加的和 
 5
 6long int s=a; 
 7int result=0
 8int wei=int (log(a)/log (10))+1//换底公式 ,得到位数 
 9int r=0
10for (r=1;r<=wei;r++
11
12  result=result+a%10;           //每一位相加 
13  a=a/10;                         
14}
 
15return result;                    //返回结果 
16}
 
17 void  tryx( long   int  r)                  // 主过程 
18
19int j,i=0,result=0
20long int w=r;                        //w用于保存原始的r值 
21long int number[32]; 
22memset (number,0,sizeof (number)); 
23long int e=2
24while (e<=int (sqrt(r)))            //分解出质因数,并存放到number[]中 
25
26  if (r%e==0)                     //找到一个质因数 
27  
28   r=r/e; 
29   number[i]=e; 
30   e=2;                        //重新初始化e 
31   i++
32  }
 
33  else 
34  
35   e++
36  }
 
37}
 
38number[i]=r;                         //r是最后一个数 
39
40for (j=0;j<=i;j++
41
42  result=result+re(number[j]); 
43}
 
44
45if ((result==re(w))&&(r!=w)) //如果质因数各位相加的结果等于w各位数字相加的结果,且质因数不等于w本身 ,输出 
46  printf("%d\n",w); 
47else 
48  tryx (w+1); 
49}
 
50 void  main() 
51
52long int snumber=0;                   
53scanf("%d",&snumber); 
54while (snumber!=0
55
56  tryx (snumber+1); 
57        scanf("%d",&snumber);   
58}
 
59}
 
60



思考: 
    1.  用换底公式求位数 是一个不错的通用技巧。 
    2.  既然编译器是用的VC++6.0 ,那么完全可以使用纯C和C++的iostream混合编程。下次尝试一下。 
    3.  分解质因数这种最基本的“公式型”算法要熟练 ,,时间是宝贵的。

你可能感兴趣的:(PKU POJ 1142 Smith Numbers 一道简单的题)