这道Java算法哪有问题,求大神尽量在这上面修改,如果实在不行请提供新的算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这道Java算法哪有问题,求大神尽量在这上面修改,如果实在不行请提供新的算法相关的知识,希望对你有一定的参考价值。
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。
首先从1开始写出自然数1,2,3,4,5,6,....
1 就是第一个幸运数。
我们从2这个数开始。把所有序号能被2整除的项删除,变为:
1 _ 3 _ 5 _ 7 _ 9 ....
把它们缩紧,重新记序,为:
1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, ...
此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,...)
最后剩下的序列类似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...
本题要求:
输入两个正整数m n, 用空格分开 (m < n < 1000*1000)
程序输出 位于m和n之间的幸运数的个数(不包含m和n)。
例如:
用户输入:
1 20
程序输出:
5
例如:
用户输入:
30 69
程序输出:
8
public static void main(String[] args)
int i, m, n, step, length;
ArrayList list = new ArrayList();
Scanner sc = new Scanner(System.in);
System.out.println("输入m n:");
m = sc.nextInt();
n = sc.nextInt();
length = 1 + Math.abs(m - n);
int value = m < n ? m : n;
for (i = 0; i < length; i++)
list.add(value++);
System.out.println(list);
step = 1;
int j;
while (step < list.size())
step++;
for (j = 0; j < list.size(); j++)
if ((j + 1) % step == 0)
list.set(j, value);
while (list.contains(value))
j = list.indexOf(value);
list.remove(j);
System.out.println(list);
System.out.println(step);
System.out.println("count=" + list.size());
幸运数问题
我是在你的基础上改的,说明见注释。另外建议你循环数直接用for(int i = 0; i < xx; i++)的形式,别把i在外面声明,除非你真的需要在外面用到这个循环数。至于一个变量多个用途就更不可取了……
import java.util.ArrayList;import java.util.Iterator;
import java.util.Scanner;
public class Myjava
public static void main(String[] args)
int m, n;
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner sc = new Scanner(System.in);
System.out.println("输入m n:");
m = sc.nextInt();
n = sc.nextInt();
//幸运数的起始点是1,而不是m
for (int i = 1; i <= n / 2; i++)
list.add(2 * i - 1);
int step = 1;
int div;
while (step < list.size())
//每次的除数都是上一次删了之后的组数里面的下一个数,第一次是2,第二次是3,删完之后是1,3,7,9,所以第三次是7,因此你每次要取的是
//剩下来的数组里面的第step个数,特例是2,因为2没能作为幸运数活下来,所以我之前直接先获得一个奇数数组,然后直接从3开始,之后的每一个除数都是幸运数
div = list.get(step);
step++;
for (int j = 0; j < list.size(); j++)
if ((j + 1) % div == 0)
list.set(j, -1);
//用Iterator来删,不然你每次判断list里面有没有是很浪费时间的
Iterator<Integer> it = list.iterator();
while(it.hasNext())
if (it.next() == -1)
it.remove();
System.out.println(list);
System.out.println(step);
//先获得幸运数数组之后,才能计算个数,只要值是m,n之间的都是你要算进去的数
int count = 0;
for (int i = 0; i < list.size(); i++)
if (list.get(i) > m && list.get(i) < n)
count++;
if (list.get(i) >= n)
break;
System.out.println("count=" + count);
参考技术A 你的这个算法本身就是有问题的,你没有理解原题的意思,原题的意思并不是依次去除数组中下标被2,被3,被4…整除的意思,我这么说你能明白吗(不知道我理解的对吗)追问
好吧,能不能把你的理解说一下,谢谢,发到网上就是为了互相讨论的
追答晚上我在看看,现在正在上课
Java算法bug求大神解答。。明天交作业 急急急急急急
我的一个求数字逆反的程序(就是把数字反着写,比如输入210 输出 12;输入1234 输出4321)我的算法好像没有问题,但是输入某些数值会出现int格式数值的最大值,不知道为什么。。明天我就要交作业了,求大神解答!!!图片是我的源代码和在cmd中运行的结果,有的输入值会出现bug的情况,有的输入值就不会,是怎么回事?
用字符串接收输入,用StringBuffer的reverse函数翻转字符串,如果确定都是整数就在做一次字符串转int ,如果严谨一点就直接从循环输出,从第一个不为0 的字符开始输出
public static void main(String[] args)
String in =new StringBuffer(args[0]).reverse().toString();
//这里如果确定都是整数就做下面的操作
int out= Integer.parseInt(in);
//如果不确定就不做上面这一步直接下面的操作
char[] outchar =in.toCharArray();
int i=0;
for(int len=outchar.length;i<len;++i)
if(outchar[i]!='0')
break;
System.out.println(in.substring(i,in.length()));
参考技术A 如果我输入12345678,貌似你的代码就不能用了。为什么不用字符数组呢?先判断下输入的是不是合法的数字字符串,然后将字符从尾道头从新组成字符串,将新的字符串转化为数字输出。追问
我的代码是哪里出错了?
是不是循环有问题?
以上是关于这道Java算法哪有问题,求大神尽量在这上面修改,如果实在不行请提供新的算法的主要内容,如果未能解决你的问题,请参考以下文章