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

1 packagecom.test;2

3 importjava.io.BufferedReader;4 importjava.io.InputStreamReader;5 importjava.util.Arrays;6

7 importorg.junit.Test;8

9 public classTest01 {10

11 /**

12 * 键盘输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。13 *@throwsException14 */

15 @Test16 public void test01()throwsException{17

18 BufferedReader bfr = new BufferedReader(newInputStreamReader(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 @Test50 public void test02() throwsException{51 System.out.println("请输入要叠加的数,大于0小于10");52 BufferedReader bfr = new BufferedReader(newInputStreamReader(System.in));53 System.out.println("请输入需要相加的个数,大于0");54 BufferedReader bfr1 = new BufferedReader(newInputStreamReader(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,inttotal){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 returnresult;72 }73

74 /**

75 * 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。76 * 答案:6,28是完数77 */

78 @Test79 public void test03() throwsException{80 System.out.println("请输入X以内的完数,不包括X:");81 BufferedReader bfr = new BufferedReader(newInputStreamReader(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 *@throwsException100 */

101 @Test102 public void test04() throwsException{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 *@throwsException125 */

126 @Test127 public void test05() throwsException{128 int total = 1; //记录猴子摘下的桃子总数129 //x/2+1 (x-(x/2+1))+1130 //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 *@throwsException140 */

141 @Test142 public void test06() throwsException{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 *@throwsException168 */

169 @Test170 public void test07() throwsException{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 * 答案:156191 *@throwsException192 */

193 @Test194 public void test08() throwsException{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 *@throwsException228 */

229 @Test230 public void test09() throwsException{231 System.out.println("输入某年某月某日,格式如:2014-07-15");232 BufferedReader bfr = new BufferedReader(newInputStreamReader(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 *@throwsException349 */

350 @Test351 public void test10() throwsException{352 System.out.println("请输入第一个整数,回车结束!");353 BufferedReader bfr1 = new BufferedReader(newInputStreamReader(System.in));354

355 System.out.println("请输入第二个整数,回车结束!");356 BufferedReader bfr2 = new BufferedReader(newInputStreamReader(System.in));357

358 System.out.println("请输入第三个整数,回车结束!");359 BufferedReader bfr3 = new BufferedReader(newInputStreamReader(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 @Test384 public void test11() throwsException{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

393 public void QuickSort(int[] array,int start,intend){394 if(start

397 int i=start,j;//初始化i,j

398 for(j=start+1;j<=end;j++) {399

400 if(array[j]

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 *@throwsException420 */

421 @Test422 public void test12() throwsException{423 System.out.println(Sum(100));424 }425

426 public int Sum(intnum){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 *@throwsException438 */

439 @Test440 public voidtest13(){441

442 System.out.println(test13_1(6));443

444 }445

446 public static int test13_1(intn) {447 if (1 ==n)448 return 1;449 else

450 return n*test13_1(n-1);451 }452

453 /**

454 * 递归方法约数,求两个数的最大公约数 ,用两个数的绝对值与这两个数较小的那个一直比较,直到相等为止。455 */

456 @Test457 public voidtest14(){458

459 System.out.println(ZuiDaGongYueShu(20,30));460

461 }462

463 public int ZuiDaGongYueShu(int num1 , intnum2){464 if(num1 ==num2){465 returnnum1 ;466 }else{467

468 return ZuiDaGongYueShu(JueDuiZhi(num1-num2),BiJiao(num1,num2));469 }470 }471

472 public int JueDuiZhi (intnum){473 return num > 0? num : -num;474 }475

476 public int BiJiao(int num1 , intnum2){477 return num1-num2> 0 ?num2 : num1;478 }479

480

481

482 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值