题目描述:
从键盘输入一个int数A(A > 1),如果存在int数X和Y(X>Y),使得A^X和A^Y均大于1000,且他们的末尾三位数相等,则称X和Y是一对“A尾相等数”
求:
任意输入A,使得X+Y值最小的A尾相等数。
如:
A = 2 ---》 X+Y = 120
分析:
代码:
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
namespace ConsoleApplication1
6
{
7
class Program
8
{
9
static void Main(string[] args)
10
{
11
//得到指定的数字
12
int a = Int32.Parse(Console.ReadLine());
13
14
//经过运算后的总值,但是只保存最后三位。
15
int sum = a;
16
17
//保存所有X的值时尾数的大小
18
int[] v = new int[1000];
19
20
//求X的最小值,使得A^X大于1000
21
int x = 1;
22
23
if (a < 1000)
24
{
25
x = getMinX(a);
26
}
27
28
for (int i = 0; i < x; i++)
29
{
30
sum = getSumA(sum, a);
31
}
32
33
//不断地给X加1,记录A^X的末尾3位数的值和X的值,直到A^X的末尾3位数出现重复的数字
34
do
35
{
36
v[sum] = x;
37
sum = getSumA(sum, a);
38
x++;
39
} while (v[sum] == 0);
40
41
//将当前X和值与原先记录A^X的末尾3位数的值的X值相加,输出最终的结果
42
Console.WriteLine(x + v[sum]);
43
}
44
45
/// <summary>
46
/// 得到sum 与 a 相乘后的最后三位数
47
/// </summary>
48
/// <param name="p"></param>
49
/// <returns></returns>
50
private static int getSumA(int sum, int a)
51
{
52
return getLast3Num(getLast3Num(sum) * getLast3Num(a));
53
}
54
55
/// <summary>
56
/// 得到P的最后三位数
57
/// </summary>
58
/// <param name="p"></param>
59
/// <returns></returns>
60
private static int getLast3Num(int p)
61
{
62
if (p >= 1000)
63
{
64
string t = p.ToString();
65
string s = t.Substring(t.Length - 3);
66
return Int32.Parse(s);
67
}
68
69
return p;
70
}
71
72
/// <summary>
73
/// 求X的最小值,使得A^X大于1000
74
/// </summary>
75
/// <param name="p"></param>
76
/// <returns></returns>
77
private static int getMinX(int p)
78
{
79
return (int)(Math.Log(1000) / Math.Log(p)) + 1;
80
}
81
}
82
}
83

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

测试结果:
输入25,输出7
输入125,输出6
输入1000,输出3
输入1111111,输出52
输入1000003,输出102
输入123454321,输出27