A尾相等数
题目描述:
从键盘输入一个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
分析:
代码:
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace 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
2using System.Collections.Generic;
3using System.Text;
4
5namespace 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
测试结果:
输入25,输出7
输入125,输出6
输入1000,输出3
输入1111111,输出52
输入1000003,输出102
输入123454321,输出27