1 package com.test;
2
3 import java.io.BufferedReader;
4 import java.io.InputStreamReader;
5 import java.util.Arrays;
6
7 import org.junit.Test;
8
9 public class Test01 {
10
11 /**
12 * 键盘输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
13 * @throws Exception
14 */
15 @Test
16 public void test01()throws Exception{
17
18 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
19
20 String str=bfr.readLine();
21 int countNum = 0;//统计数字的个数
22 int countChar = 0;//统计英文字母的个数
23 int countSpace = 0;//统计空格的个数
24 int countOthers = 0;//统计其它字符的个数
25
26 for(int i=0; i < str.length();i++){
27 char s = str.charAt(i);
28
29 if(s > '0' && s < '9'){
30 countNum++;
31 }else if( (s > 'a' && s < 'z') || (s > 'A' && s < 'Z')){
32 countChar++;
33 }else if(s == ' '){
34 countSpace++;
35 }else{
36 countOthers++;
37 }
38 }
39 System.out.println("数字个数:"+countNum);
40 System.out.println("英文字母个数:"+countChar);
41 System.out.println("空格个数:"+countSpace);
42 System.out.println("其他字符个数:"+countOthers);
43
44 }
45
46 /**
47 * 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
48 */
49 @Test
50 public void test02() throws Exception{
51 System.out.println("请输入要叠加的数,大于0小于10");
52 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
53 System.out.println("请输入需要相加的个数,大于0");
54 BufferedReader bfr1 = new BufferedReader(new InputStreamReader(System.in));
55
56 int num = Integer.parseInt(bfr.readLine());
57 int total = Integer.parseInt(bfr1.readLine());
58 int b = (int)nums(num , total);
59 System.out.println("result is :"+b);
60 }
61
62 public double nums(int num,int total){
63 double result = 0;
64 double a = 0;
65
66 for(int i = 0 ; i < total ; i++){
67
68 a = num*(Math.pow(10, i))+a;
69 result += a;
70 }
71 return result;
72 }
73
74 /**
75 * 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
76 * 答案:6,28是完数
77 */
78 @Test
79 public void test03() throws Exception{
80 System.out.println("请输入X以内的完数,不包括X:");
81 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
82
83 int num = Integer.parseInt(bfr.readLine());
84 //先获得一个数所有的因子
85 for(int i = 1; i < num ; i++){
86 int total = 0;
87 for(int j = 1 ; j < i ; j++){
88 if(i % j == 0){
89 total += j;
90 }
91 }
92 if(total == i){
93 System.out.println("数"+i+"是完数");
94 }
95 }
96 }
97 /***
98 * 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
99 * @throws Exception
100 */
101 @Test
102 public void test04() throws Exception{
103
104 double higth10 = 0; //计算第10次的反弹高度
105 double total10 = 0; //计算10次经过的米数
106 //int num = 0; //下落的次数
107 //100/2 100/2/2 100/2/2/2
108 for(int i= 1 ; i < 10 ; i++){
109
110 double a =100/(Math.pow(2, i-1))+100/(Math.pow(2, i));
111 total10 += a;
112
113 if(i == 9){
114 higth10 = 100/(Math.pow(2, i+1));
115 }
116 }
117
118 System.out.println("第10次落地时,共经过"+total10+"米,第10次反弹"+higth10+"米");
119
120 }
121 /**
122 * 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,
123 * 又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第一天共摘了多少桃子。
124 * @throws Exception
125 */
126 @Test
127 public void test05() throws Exception{
128 int total = 1; //记录猴子摘下的桃子总数
129 //x/2+1 (x-(x/2+1))+1
130 //1 (1+1)*2 (4+1)*2
131 for(int i =2 ; i <= 10; i++){
132 total = (total+1)*2;
133 }
134 System.out.println("猴子第一天摘的总的桃子数是:"+total+"个");
135 }
136
137 /**
138 * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
139 * @throws Exception
140 */
141 @Test
142 public void test06() throws Exception{
143 int[] nums = {1,2,3,4}; //数组保存所有的数
144 for(int i = 0 ; i < 4 ;i++){ //循环获得百位数
145 int num3 = nums[i];
146 for(int j =0 ; j < 4 ; j++){//循环获得十位数
147
148 int num2 = nums[j];
149 if(num3 == num2){
150 continue;
151 }else{
152 for(int k = 0 ; k < 4;k++){ //循环获得个位数
153 int num1 = nums[k];
154 if(num1 == num2 || num1 == num3){
155 continue;
156 }else{
157 System.out.println(num3+""+num2+""+num1);
158 }
159 }
160 }
161 }
162 }
163 }
164
165 /**
166 * 题目:判断101-200之间有多少个素数,并输出所有素数。
167 * @throws Exception
168 */
169 @Test
170 public void test07() throws Exception{
171 //素数,除了1和本身之外不能被整除的数
172 //注意:return是跳出所有的循环,break是跳出当前的循环
173 for(int i = 101;i < 201 ; i++ ){
174 boolean isSuShu = true;
175 for(int j = 2 ; j < i ; j++){
176 if(i%j == 0){
177 isSuShu = false;
178 break;
179 }
180 }
181
182 if(isSuShu){
183 System.out.println("素数:"+i);
184 }
185 }
186 }
187
188 /**
189 * 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
190 * 答案:156
191 * @throws Exception
192 */
193 @Test
194 public void test08() throws Exception{
195
196 //x+100 x+100+168
197
198 for(int i = 0 ; i < 100000 ; i++){
199 int a = i + 100;
200 double value = Math.sqrt(a);
201 String origin = String.valueOf(value);
202 String[] values= origin.split("\\.");
203
204 for(int j = 0 ; j < values.length ; j++){
205 if(values[j].equals("0")){
206
207 for(int m = 0 ; m < 100000 ; m++){
208 int b = i + 168;
209 double value1 = Math.sqrt(b);
210 String origin1 = String.valueOf(value1);
211 String[] values1= origin1.split("\\.");
212
213 for(int n = 0 ; n < values1.length ; n++){
214 if(values1[j].equals("0")){
215 System.out.println("这个数就是:"+i);
216 return;
217 }
218 }
219 }
220 }
221 }
222 }
223 }
224
225 /**
226 * 输入某年某月某日,判断这一天是这一年的第几天?
227 * @throws Exception
228 */
229 @Test
230 public void test09() throws Exception{
231 System.out.println("输入某年某月某日,格式如:2014-07-15");
232 BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
233
234 String time = bfr.readLine();
235 String[] times = time.split("-");
236 int year = 0;
237 int month = 0;
238 int day = 0;
239 for(int i = 0 ; i < times.length ; i++){
240 year = Integer.parseInt(times[0]);
241 month = Integer.parseInt(times[1]);
242 day = Integer.parseInt(times[2]);
243 }
244 //思路,判断是否是闰年,是:366天,不是:365天
245 //闰年的条件:
246 //①、普通年能被4整除的为闰年。(如2004年就是闰年,1901年不是闰年)
247 //②、世纪年能被400整除而不能被3200整除的为闰年。(如2000年是闰年,3200年不是闰年)
248 //③、对于数值很大的年份能整除3200,但同时又能整除172800则又是闰年.(如172800年是闰年,8640
249
250 boolean isRun = false ; //isRun是否是闰年,默认不是
251 if(year % 4 == 0){//能被四整除,有可能是闰年
252
253 if(year % 400 == 0 && year % 3200 == 0){
254 isRun = false;
255 }else if(year % 3200 ==0 && year % 172800 != 0){
256 isRun = false;
257 }else{
258 isRun = true;
259 }
260 }else{
261 isRun = false;
262 }
263
264 if(isRun){//366天
265
266 switch(month){
267 case 1:
268 System.out.println("这一天是这一年的第"+day+"天");
269 break;
270 case 2:
271 System.out.println("这一天是这一年的第"+(31 + day)+"天");
272 break;
273 case 3:
274 System.out.println("这一天是这一年的第"+(60 + day)+"天");
275 break;
276 case 4:
277 System.out.println("这一天是这一年的第"+(91 + day)+"天");
278 break;
279 case 5:
280 System.out.println("这一天是这一年的第"+(121 + day)+"天");
281 break;
282 case 6:
283 System.out.println("这一天是这一年的第"+(152 + day)+"天");
284 break;
285 case 7:
286 System.out.println("这一天是这一年的第"+(182 + day)+"天");
287 break;
288 case 8:
289 System.out.println("这一天是这一年的第"+(213 + day)+"天");
290 break;
291 case 9:
292 System.out.println("这一天是这一年的第"+(244 + day)+"天");
293 break;
294 case 10:
295 System.out.println("这一天是这一年的第"+(274 + day)+"天");
296 break;
297 case 11:
298 System.out.println("这一天是这一年的第"+(305 + day)+"天");
299 break;
300 case 12:
301 System.out.println("这一天是这一年的第"+(335 + day)+"天");
302 break;
303 }
304
305 }else{//365天
306 switch(month){
307 case 1:
308 System.out.println("这一天是这一年的第"+day+"天");
309 break;
310 case 2:
311 System.out.println("这一天是这一年的第"+(31 + day)+"天");
312 break;
313 case 3:
314 System.out.println("这一天是这一年的第"+(59 + day)+"天");
315 break;
316 case 4:
317 System.out.println("这一天是这一年的第"+(90 + day)+"天");
318 break;
319 case 5:
320 System.out.println("这一天是这一年的第"+(120 + day)+"天");
321 break;
322 case 6:
323 System.out.println("这一天是这一年的第"+(151 + day)+"天");
324 break;
325 case 7:
326 System.out.println("这一天是这一年的第"+(181 + day)+"天");
327 break;
328 case 8:
329 System.out.println("这一天是这一年的第"+(212 + day)+"天");
330 break;
331 case 9:
332 System.out.println("这一天是这一年的第"+(243 + day)+"天");
333 break;
334 case 10:
335 System.out.println("这一天是这一年的第"+(273 + day)+"天");
336 break;
337 case 11:
338 System.out.println("这一天是这一年的第"+(304 + day)+"天");
339 break;
340 case 12:
341 System.out.println("这一天是这一年的第"+(334 + day)+"天");
342 break;
343 }
344 }
345 }
346 /**
347 * 输入三个整数x,y,z,请把这三个数由小到大输出。
348 * @throws Exception
349 */
350 @Test
351 public void test10() throws Exception{
352 System.out.println("请输入第一个整数,回车结束!");
353 BufferedReader bfr1 = new BufferedReader(new InputStreamReader(System.in));
354
355 System.out.println("请输入第二个整数,回车结束!");
356 BufferedReader bfr2 = new BufferedReader(new InputStreamReader(System.in));
357
358 System.out.println("请输入第三个整数,回车结束!");
359 BufferedReader bfr3 = new BufferedReader(new InputStreamReader(System.in));
360
361 int num1 = Integer.parseInt(bfr1.readLine());
362 int num2 = Integer.parseInt(bfr2.readLine());
363 int num3 = Integer.parseInt(bfr3.readLine());
364
365 int[] nums = new int[5];
366 nums[0] = num1;
367 nums[1] = num2;
368 nums[2] = num3;
369 nums[3] = 1;
370 nums[4] = 6;
371 //冒泡排序法:思路是相邻两个进行比较,依次向后一位移动,有顺序改变的需要调换位置,重新赋值
372 for(int i = 0 ; i < nums.length ; i++){
373 for(int j = i+1 ; j < nums.length ; j++){
374 if(nums[i] > nums[j]){ //i 大于 j ,先把i值用tem临时变量保存,再将j的值给i,最后将tem的值给j,即可实现i和j的对换
375 int tem = nums[i];
376 nums[i] = nums[j];
377 nums[j] = tem;
378 }
379 }
380 }
381 }
382
383 @Test
384 public void test11() throws Exception{
385 int[] array=new int[]{44,213,134,11,77,78,23,43};
386 QuickSort(array, 0, array.length-1);
387 for(int i=0;i<array.length;i++)
388 {
389 System.out.println((i+1)+"th:"+array[i]);
390 }
391 }
392
393 public void QuickSort(int[] array,int start,int end){
394 if(start<end)
395 {
396 int key=array[start];//初始化保存基元
397 int i=start,j;//初始化i,j
398 for(j=start+1;j<=end;j++) {
399
400 if(array[j]<key)//如果此处元素小于基元,则把此元素和i+1处元素交换,并将i加1,如大于或等于基元则继续循环
401 {
402 int temp=array[j];
403 array[j]=array[i+1];
404 array[i+1]=temp;
405 i++;
406 }
407
408 }
409 array[start]=array[i];//交换i处元素和基元
410 array[i]=key;
411 QuickSort(array, start, i-1);//递归调用
412 QuickSort(array, i+1, end);
413
414 }
415 }
416
417 /**
418 * 递归方法sum,求1+2+...+100 的求和
419 * @throws Exception
420 */
421 @Test
422 public void test12() throws Exception{
423 System.out.println(Sum(100));
424 }
425
426 public int Sum(int num){
427
428 if(num > 0){
429 return num + Sum(num-1);
430 }else{
431 return 0;
432 }
433
434 }
435 /**
436 * 递归方法sum,求1*2*...*6 的求和
437 * @throws Exception
438 */
439 @Test
440 public void test13(){
441
442 System.out.println(test13_1(6));
443
444 }
445
446 public static int test13_1(int n) {
447 if (1 == n)
448 return 1;
449 else
450 return n*test13_1(n-1);
451 }
452
453 /**
454 * 递归方法约数,求两个数的最大公约数 ,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。
455 */
456 @Test
457 public void test14(){
458
459 System.out.println(ZuiDaGongYueShu(20,30));
460
461 }
462
463 public int ZuiDaGongYueShu(int num1 , int num2){
464 if(num1 == num2){
465 return num1 ;
466 }else{
467
468 return ZuiDaGongYueShu(JueDuiZhi(num1-num2),BiJiao(num1,num2));
469 }
470 }
471
472 public int JueDuiZhi (int num){
473 return num > 0? num : -num;
474 }
475
476 public int BiJiao(int num1 , int num2){
477 return num1-num2> 0 ? num2 : num1;
478 }
479
480
481
482 }