“a~z”之和

源起?

看到题目,你也许会觉得奇怪。但在java里却是可以的(其他编程语言不知道),下面就看看如何计算的把。

经过

这是一个有趣的发现,源于我看到一本书上:char类型的a~z(区分大小写)
可以自动提升成int类型,获得其对应的ASCII值.
于是对此进行了加,减,乘,除.
大写的A~Z和小写的a~z产生的ASCII值不一样,但是是连贯的.

image-1610

程序运行截图

分析及实践

  1. 我首先创建了一个char[]数组,然后把a~z放进去[注意:A~Z与a~z所产生的数值是不一样的]
  2. 然后在用循环输出
    1
    System.out.print(SkTest[i] + 0 + " ");
  3. 利用+0是为了让其转换为int类型
  4. a~z所对应的int数值是:97~122,A~Z所对应的int数值是:65~90
  5. 然后再将上面的数字进行计算就可以获得其加,减,乘,除的结果了.
  6. 下面是我计算的结果:
  7. a~z:加:2847;减:14;乘[数值超过Long最大值,不精确]:6982962423800004608;除:1.
  8. A~Z:加:2015;减:14;乘[数值超过Long最大值,不精确]:7430394426012205056;除:1.

源代码

1
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
import java.util.Scanner;

/**
 * A~Z运算
 *
 * @author Ruidong_pu
 * @version 2012.10.4
 */
public class TestTop {

    Scanner sc = new Scanner(System.in);
    private int menuchoose;

    public void show() {// 输出.
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>");
        System.out.println("这是一个有趣的发现,源于我看到一本书上:char类型的a~z(区分大小写)");
        System.out.println("可以自动提升成int类型,获得其对应的ASCII值.");
        System.out.println("于是对此进行了加,减,乘,除.");
        System.out.println("大写的A~Z和小写的a~z产生的ASCII值不一样,但是是连贯的.");
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>");

        do {
            System.out.println("选择:1.小写;2.大写;3.退出.");
            try{
                menuchoose = sc.nextInt();
            }catch(Exception e){
                System.out.println("请确认输入的是数字!");
            }

            switch (menuchoose) {
            case 1:
                Lowercasetest();// 小写
                break;
            case 2:
                Capitalletterstest();// 大写
                break;
            case 3:
                System.out.println("程序退出,谢谢使用!");
                System.exit(0);
            }
        } while (true);

    }

    public void Capitalletterstest() { // 大写字母测试
        /*
         * 其中A~Z自动提升到int类型.变成其对应的ASCII值. 然后即可进行运算,a~z分别对应的ASCII值范围为:65~90.
         * 其相加的和为:2015. 其相乘的和超出Long的最大值,因此出现了负数.
         */
        System.out.println("A~Z自动转换成的数字:");
        char[] SkTest = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
                'W', 'X', 'Y', 'Z' };
        for (int i = 0; i < SkTest.length; i++) { // 输出int类型的数字
            System.out.print(SkTest[i] + 0 + " ");
        }

        do {
            System.out.println("\r1.加;2.减;3.乘;4.除;5.退出");
            try {
                menuchoose = sc.nextInt();
            } catch (Exception e) {
                System.out.println("输入貌似出错了哦!~~囧");
            }
            switch (menuchoose) {
            case 1:
                System.out.println("下面是和:>>>>>>>>>>>>>>>>>>>>>>");
                add(65, 90);// 调用+方法
                break;
            case 2:
                System.out.println("下面是差:>>>>>>>>>>>>>>>>>>>>>>");
                minus(65, 91);
                break;
            case 3:
                System.out
                        .println("下面是积【已经损失精度,积大于Long的最大长度】:>>>>>>>>>>>>>>>>>>>>>>");
                ride(65, 91);
                break;
            case 4:
                System.out.println("下面是商:>>>>>>>>>>>>>>>>>>>>>>");
                divide(65, 91);
                break;
            case 5:
                show();
            }
        } while (true);
    }

    public void Lowercasetest() {// 小写字母测试.
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        /*
         * 其中a~z自动提升到int类型.变成其对应的ASCII值. 然后即可进行运算,a~z分别对应的ASCII值范围为:97~122.
         * 其相加的和为:2847. 其相乘的和超出Long的最大值,因此出现了负数.
         */
        char[] sk = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
                'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
                'x', 'y', 'z' };
        //
        System.out.println("a~z自动转换成的数字:");
        for (int i = 0; i < sk.length; i++) {
            System.out.print(sk[i] + 0 + " ");
        }
        do {
            System.out.println("\r1.加;2.减;3.乘;4.除;5.退出");
            try {
                menuchoose = sc.nextInt();
            } catch (Exception e) {
                System.out.println("输入貌似出错了哦!~~囧");
            }
            switch (menuchoose) {
            case 1:
                System.out.println("下面是和:>>>>>>>>>>>>>>>>>>>>>>");
                add(97, 122);// 调用+方法
                break;
            case 2:
                System.out.println("下面是差:>>>>>>>>>>>>>>>>>>>>>>");
                minus(97, 123);// 第二个数+1.因为在minus方法中的for循环为i<第二个数,因此第二个数需+1处理.
                break;
            case 3:
                /*
                 * 下面是97~122的数相乘 已超出Long的最大值,故已经损失精度. 相乘的结果为:6982962423800004608
                 * >>>Long的最大值为:9223372036854775807
                 * >>>相减的结果为:14.(97-1...98-96...99-92......)
                 */
                System.out
                        .println("下面是积<已经损失精度,积大于Long的最大长度>:>>>>>>>>>>>>>>>>>>>>>>");
                ride(97, 123);// 第二个数+1.因为在minus方法中的for循环为i<第二个数,因此第二个数需+1处理.
                break;
            case 4:
                System.out.println("下面是商:>>>>>>>>>>>>>>>>>>>>>>");
                divide(97, 123);// 第二个数+1.因为在minus方法中的for循环为i<第二个数,因此第二个数需+1处理.
                break;
            case 5:
                show();
            }
        } while (true);
    }

    // 相加

    public int add(int MinNum, int MaxNum) {
        int num = (MinNum + MaxNum) * 26 / 2;
        System.out.println(num);
        return num;
    }

    // 相减

    public long minus(int MinNum, int MaxNum) {
        long num = 1L;
        for (int t = MinNum; t < MaxNum; t++) {
            num = Long.valueOf(t) - num;
        }
        System.out.println(num);
        return num;
    }

    // 相乘

    public long ride(int MinNum, int MaxNum) {
        long num = 1L;
        for (int t = MinNum; t < MaxNum; t++) {
            num = Long.valueOf(t) * num;
        }
        System.out.println(num);
        return num;
    }

    // 相除

    public long divide(int MinNum, int MaxNum) {
        long num = 1L;
        for (int t = MinNum; t < MaxNum; t++) {
            num = Long.valueOf(t) / num;
        }
        System.out.println(num);
        return num;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestTop ts = new TestTop();
        ts.show();

    }
}

最近的学习

最近一直埋头在Java上,对于Database落下了不少课程,看来后面要“痛补”Database才行。

一些基础教程

看了很多基础的教程,基本上前几章都可以掠过了(大概讲一些:怎么配置环境,怎么输出“Hello World”,什么后缀名,垃圾回收(GC)等等)。看这些教程个人觉得很受用,也下载了一些视频,但因为有个坏习惯(边听歌边看教程),所以视频就被搁置了。

总结如下:

  1. 8个数据类型是:boolean,int,double,byte,long,short,float,char.(注意:java.lang.String是一个类)
  2. 每个数据类型都有自己的包装类分别是(基本数据类型/包装类):boolean/Boolean,int/Integer,double/Double,byte/Byte,long/Long,short/Short,float/Float,char/Character.
  3. 尽量少使用static,因为static修饰的方法或变量(普通类禁止被声明为static,只有内部类才可以),不能被回收(GC),会导致影响程序的性能.

其余的一些都做了截图。

Java包装类
image-1605

Java包装类

这个截图来自:《JAVA私塾跟我学系列》,特别适合入门的朋友看,语言精炼,代码讲解也很清楚。(可Google去搜索下载PDF版本)

排序

首先上一张我

腾讯微博截图_快速排序
image-1606

腾讯微博截图_快速排序

对于快速排序的简介就不说了,这几天一直在弄快排,基本是每天开电脑必须敲一遍快速排序的代码,测试正确了。才去做别的事情,因为理解起来实在太难,只能死记硬背把代码记在脑海里,很痛苦。

快速排序源代码:

1
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
/**
 * 快速排序
 *
 * @author Ruidong_pu
 * @version 2012.9.30
 */
public class TestTop {

    /**
     *
     * @param pDate
     * @param left
     * @param right
     * @return
     */

    /*
     * 快速排序.
     */

    public int[] Quicks(int pDate[], int left, int right) {
        int i = left, j = right;
        int middle, strTemp;

        middle = pDate[(left + right) / 2];

        do {

            while ((pDate[i] &lt; middle) &amp;&amp; (i &lt; right)) {
                i++;
            }

            while ((pDate[j] &gt; middle) &amp;&amp; (j &gt; left)) {
                j--;
            }

            if (i  left) {
            Quicks(pDate, left, j);
        }

        return pDate;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestTop tp = new TestTop();
        int[] test = { 5, 2, 3, 5, 6, 8, 9, 26, 2, 9, 5, 6, 9, 669, 69, 65, 68,
                70 };
        tp.Quicks(test, 0, test.length - 1);

    }
}