这道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算法哪有问题,求大神尽量在这上面修改,如果实在不行请提供新的算法的主要内容,如果未能解决你的问题,请参考以下文章

程序员面试算法开发,竟倒在这道基础数学题!微软开源部分《我的世界》Java 代码;Ember.js 3.4.5发布

求助大神们看下这道算法题

用java操作ldap是报错,求大神解救

请问这道c++编程题怎么做?(急求大神帮忙)——抽奖2

如何防范算法求逆

在阿里云入了大坑, 园子里的大神, 求搭救