“a~z”之和

源起?

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

经过

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

image-1610

程序运行截图

分析及实践

  1. 我首先创建了一个char[]数组,然后把a~z放进去[注意:A~Z与a~z所产生的数值是不一样的]
  2. 然后在用循环输出
    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.

源代码

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

腾讯微博截图_快速排序

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

快速排序源代码:


/**
* 快速排序
*
* @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] < middle) && (i < right)) {
i++;
}

while ((pDate[j] > middle) && (j > 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);

}
}