PKU POJ 1142 Smith Numbers 一道簡單的題
http://acm.pku.edu.cn/JudgeOnline/problem?id=1142
以前就用pascal做過這道題,C再做一遍
思考:
1. 用換底公式求位數 是一個不錯的通用技巧。
2. 既然編譯器是用的VC++6.0 ,那么完全可以使用純C和C++的iostream混合編程。下次嘗試一下。
3. 分解質因數這種最基本的“公式型”算法要熟練 ,,時間是寶貴的。
以前就用pascal做過這道題,C再做一遍
1
#include <stdio.h>
2
#include <math.h>
3
#include <memory.h>
4
long int re(long int a) //re函數功能:返回一個數各位數字相加的和
5

{
6
long int s=a;
7
int result=0;
8
int wei=int (log(a)/log (10))+1; //換底公式 ,得到位數
9
int r=0;
10
for (r=1;r<=wei;r++)
11

{
12
result=result+a%10; //每一位相加
13
a=a/10;
14
}
15
return result; //返回結果
16
}
17
void tryx(long int r) //主過程
18

{
19
int j,i=0,result=0;
20
long int w=r; //w用于保存原始的r值
21
long int number[32];
22
memset (number,0,sizeof (number));
23
long int e=2;
24
while (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
}
38
number[i]=r; //r是最后一個數
39
40
for (j=0;j<=i;j++)
41

{
42
result=result+re(number[j]);
43
}
44
45
if ((result==re(w))&&(r!=w)) //如果質因數各位相加的結果等于w各位數字相加的結果,且質因數不等于w本身 ,輸出
46
printf("%d\n",w);
47
else
48
tryx (w+1);
49
}
50
void main()
51

{
52
long int snumber=0;
53
scanf("%d",&snumber);
54
while (snumber!=0)
55

{
56
tryx (snumber+1);
57
scanf("%d",&snumber);
58
}
59
}
60
#include <stdio.h> 2
#include <math.h> 3
#include <memory.h> 4
long int re(long int a) //re函數功能:返回一個數各位數字相加的和 5


{ 6
long int s=a; 7
int result=0; 8
int wei=int (log(a)/log (10))+1; //換底公式 ,得到位數 9
int r=0; 10
for (r=1;r<=wei;r++) 11


{ 12
result=result+a%10; //每一位相加 13
a=a/10; 14
} 15
return result; //返回結果 16
} 17
void tryx(long int r) //主過程 18


{ 19
int j,i=0,result=0; 20
long int w=r; //w用于保存原始的r值 21
long int number[32]; 22
memset (number,0,sizeof (number)); 23
long int e=2; 24
while (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
} 38
number[i]=r; //r是最后一個數 39

40
for (j=0;j<=i;j++) 41


{ 42
result=result+re(number[j]); 43
} 44

45
if ((result==re(w))&&(r!=w)) //如果質因數各位相加的結果等于w各位數字相加的結果,且質因數不等于w本身 ,輸出 46
printf("%d\n",w); 47
else 48
tryx (w+1); 49
} 50
void main() 51


{ 52
long int snumber=0; 53
scanf("%d",&snumber); 54
while (snumber!=0) 55


{ 56
tryx (snumber+1); 57
scanf("%d",&snumber); 58
} 59
} 60

思考:
1. 用換底公式求位數 是一個不錯的通用技巧。
2. 既然編譯器是用的VC++6.0 ,那么完全可以使用純C和C++的iostream混合編程。下次嘗試一下。
3. 分解質因數這種最基本的“公式型”算法要熟練 ,,時間是寶貴的。

