码迷,mamicode.com
首页 > 编程语言 > 详细

网上的一些java算法题的个人练习笔记

时间:2014-09-10 17:24:40      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   java   ar   for   2014   art   

  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 }

 

网上的一些java算法题的个人练习笔记

标签:style   blog   color   io   java   ar   for   2014   art   

原文地址:http://www.cnblogs.com/LeeDane/p/3964742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!