1.素数问题:
求100以内的素数?
解:首先了解什么是素数:比1大的整数中,如果除了1和它本身以外,不能被其他正整数整除,就叫素数(质数)。
思路:先设计一个任意数的是否是素数的方法:这里我用for循环先求下6是否是素数,请看代码:
boolean flag = false;
int m=6;
for (int i = 2; i <= 6/2; i++) {
if(m%i==0)
{
System.out.println(m+"不是质数(素数)");
flag=true;
break;
}
}
if (!flag) {
System.out.println(m+ "是质数(素数)");
}
在for循环中判断 如果6模上,6以内且大于2的数为0则是素数,直接break循环,注意这里设计for循环的终止条件为6/2,是因为如果一个数得除数大于它的1/2,就不会被整除了,这样后面的循环就没有必要再进行下去。好了一次判断结束了,在求100以内的就好算了,只需要在外面在加成循环就ok了,请看代码:
for (int j = 2; j <= 100; j++) {
boolean flag = false;
for (int i = 2; i <= j / 2; i++) {
if (j % i == 0) {
System.out.println(j + "不是质数(素数)");
flag = true;
break;
}
}
if (!flag) {
System.out.println(j + "是质数(素数)");
}
}
2.水仙花:100到999之间的水仙花数
解:首先,了解下什么是水仙花,所谓水仙花数就是一个任意位数,它各位的立方之和加起来的数值等于本身,比如说,153,153 = 1 + 125 + 27 ;这题求的是1000以内,所以就先求各个位置的数了,那怎么求呢,请看代码:
int i=153;
int a=(i%100)/10; //十位
int b=i%10; //个位
int c=i/100; //百位
System.out.println("a="+a+",b"+b+",c="+c);
然后在去求这个三个位置上的立方的和是否等于这个数本身:请看代码:
int m=0;
for(int i=100;i<1000;i++) {
int a=(i%100)/10; //十位
int b=i%10; //个位
int c=i/100; //百位
if((int)(Math.pow(a, 3)+Math.pow(b, 3)+Math.pow(c, 3))==i) {
System.out.println(i+"是水仙花");
m++;
}
}
System.out.println("水仙花数为"+m+"个!");
打印出结果为:
153是水仙花
370是水仙花
371是水仙花
407是水仙花
水仙花数为4个!
3.手写的冒泡排序法:
解:
原理:比较两个相邻的元素,将值大的元素交换至右端。
比如说一个数组里面存了5个int 类型的数,我们先做一次相邻的数比较,请看代码:
int a[]= {1,3,2,5,4};
for (int i = 0; i < a.length-1; i++) {
if(a[i]>a[i+1]) {//此时需交换
System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
int m=a[i+1];
a[i+1]=a[i];
a[i]=m;
System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
}
}
这是做了一次,把最大的数冒泡到最右端的,其他的依次类推,只要在外层加层循环就可以了,请看代码:
int a[]= {1,3,2,5,4};
for (int j = 0; j < a.length-1; j++) {
for (int i = 0; i < a.length-1; i++) {
if(a[i]>a[i+1]) {//此时需交换
System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
int m=a[i+1];
a[i+1]=a[i];
a[i]=m;
System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
}
}
}
System.out.println(Arrays.toString(a));
最后我们打印出结果为:
a[1]3,a[2]2
a[1]2,a[2]3
a[3]5,a[4]4
a[3]4,a[4]5
[1, 2, 3, 4, 5],完美解决了,其实这个代码还是可以优化下,比如说我们在内存循环的时候,并不需要每次循环到最后一个数,比如我们第二次循环时只需要比较前面4个数,除此之外,如果我们可以加一个变量,在做第一次比较时,如果没有必要冒泡,就直接退出循环。所以最终代码为:
int a[]= {1,3,2,5,4};
for (int j = 0; j < a.length-1; j++) {
boolean flag = false;
for (int i = 0; i < a.length-1-j; i++) {
if(a[i]>a[i+1]) {//此时需交换
System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
int m=a[i+1];
a[i+1]=a[i];
a[i]=m;
System.out.println("a["+i+"]"+a[i]+",a["+(i+1)+"]"+a[i+1]);
flag=true;
}
}
if(!flag) {
break;
}
}
System.out.println(Arrays.toString(a));
}