“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();

    }
}

练习:9

这个练习是对书本上第二章的内容进行复习。
包含了以下知识点:

  1. 使用Scanner类从键盘获得数据;
  2. 使用”%”取余运算符获得五位数的每个数(比如:54321是一个五位数,取余获得个位,十位,百位,千位,万位的数);
  3. 使用int,double,string数据类型存入数据(char的数据类型未使用);
  4. 通过算术运算符获得商品总价;
  5. 通过调用已存入的变量,来输出最终结果.

源代码如下:

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
/*
 * 这个练习的名字改为了Test开头
 * 这个练习对第二章的内容进行了复习,很想加一些第三章的内容进去,但还是算了
 */
import java.util.*;
public class Test1 {
    public static void main (String[]args){
        System.out.println ("请在下方输入下方提示的内容:");
        System.out.println ("折扣:0.98.");
        System.out.println ("皮包价格:1000.");
        System.out.println ("背包价格:500.");
        System.out.println ("帐篷价格:800.");
        System.out.println ("会员卡号:89658.");
        System.out.println ("会员姓名:张三");
        System.out.println ("提示:每次使用键盘输入完数据,请按回车进入下一项");
        System.out.println ("******************");
        //提示信息结束,开始变量的赋值
        Scanner input = new Scanner (System.in);
        System.out.println ("请输入折扣,如0.98:");
        double b = input.nextDouble();
        System.out.println ("请输入皮包的价格:");
        int c = input.nextInt();
        System.out.println ("请输入背包的价格:");
        int d = input.nextInt();
        System.out.println ("请输入帐篷的价格:");
        int a = input.nextInt();
        System.out.println ("请输入五位会员号码:");
        int e = input.nextInt();
        System.out.println ("请输入会员姓名:");
        String h = input.next();
        int gewei = e %10 ;//使用取余获得会员卡号的个位数字
        int shiwei = e /10 %10 ;//使用取余获得会员卡号的十位数字
        int baiwei = e /100 %10 ;//使用取余获得会员卡号的百位数字
        int qianwei = e / 1000 %10 ;//使用取余获得会员卡号的千位数字
        int wanwei = e / 10000 %10 ;//使用取余获得会员卡号的万位数字
        System.out.println ("******************");
        //计算五位会员号码之和
        System.out.println ("会员姓名:"+h);
        int huiyuan = gewei + shiwei + baiwei + qianwei + wanwei ;
        System.out.println ("会员号之和为:"+huiyuan);
        //计算商品之和
        double f = (a + c + d)* b ; //计算商品之和
        System.out.println ("商品之和为:"+f);
        //最终输出
        System.out.println ("******************");
        System.out.println ("商场规定:商品总数大于2000,会员号之和大于20时可获得奖品.\n!如何确定会员数据是否符合商场的奖励规定,将在第三章解释.");
    }
}