Java 程序打印数字 3 和 5 的指数级数并将结果限制在 1000 以下

Posted

技术标签:

【中文标题】Java 程序打印数字 3 和 5 的指数级数并将结果限制在 1000 以下【英文标题】:Java program to print exponential series for numbers 3 and 5 and limit the result to below 1000 【发布时间】:2016-06-23 16:09:10 【问题描述】:

我是 Java 编程新手,在 Project Euler 上尝试过一些问题。我以某种方式提出了自己的打印 3 和 5 指数序列的问题,并将结果限制在 1000 以下。我研究了 3 天以找到解决此问题的最佳方法,但找不到相关文章。我遇到过关于指数级数的算法,但这些算法对于我现在的能力来说太先进了。

对于解决此问题的任何帮助,我将不胜感激。请看我试过的代码

public class Exponent         

  public static void main (String[] args) 

    // Declared integers for base and exponent

       int i = 0;  /* for base */      
       int n = 0;  /* for exponent */

       for (n=1; n<5; n++) 

           for (i=1; i<=5; i++) 

               if (i%3 == 0 || i%5 == 0) 

                    System.out.println(Math.pow(i,n));

               

           

       

    


这段代码打印出以下结果:

3.0
5.0
9.0
25.0
27.0
125.0
81.0
625.0

我的问题是很明显,我通过限制循环内的基数和指数值来强制指数打印在 1000 以下

for (n=1; n<5; n++) //because n<=5 would print result for 5 power 5 which is 3125

我想以某种方式将结果限制在 1000 以下,所以不确定这个声明是否恰当

int result = 1000; // result variable as 1000

另外,我希望代码以 3 和 5 交替打印输出,如下所示。我的程序分别按 3 和 5 的顺序打印输出。

Desired output:

3.0
5.0
9.0
27.0
125.0
81.0
625.0
243.0
729.0

然后停在那里,因为下一个值将超过 1000。

我还想知道是否有任何其他方法可以代替使用 Math.pow() 方法,因为它返回的是 double 而不是 int。我想避免双重值,只打印如下:

Without double:

3
5
9
27
81
125
243
625
729

【问题讨论】:

这似乎是正确问题的错误解决方案...如果您想要一个双精度整数,只需解析它。例如int aValue = (int) Math.pow(i,n);。现在,在算法部分,我不确定你问的是什么。您想要一个函数来收集 1000 以下的指数吗?如果是这样,添加一个限制(例如if 结构) 【参考方案1】:

不使用 Math.pow() (并以不同的顺序打印):

  int[] bases =  3, 5 ;
  long maxval = 1000L;
  for (int base : bases) 
     long value = base;
     do 
        System.out.println( value );
        value *= base;
      while (value < maxval);
  

【讨论】:

很酷的解决方案,但不是打印所有的 3,然后是所有的 5,而不是问题询问的方式是在它们之间切换吗? 感谢您的解决方案,但正如#duncan 所提到的,这首先打印出 3 的指数,然后打印出 5 的指数。我正在寻找在 3 和 5 之间切换【参考方案2】:

首先创建一个double来存储结果:

double result = 0;

然后创建一个无限循环,使用 3 和 5 计算结果,并在结果高于 1000 时中断。

while(true)

    result = Math.pow(3, n);
    if(result > 1000)
    
        break;
    
    System.out.println(((int)result));
    result = Math.pow(5, n);
    if(result < 1000)
    
        System.out.println((int)result);
              
    n++;

由于 3 的指数小于 5,因此在达到 3 的最大指数之前不会突破。由于没有发生中断,因此除非有效,否则不要打印 5。

还可以将双精度值打印为 int 值,只需将其转换为 int。

编辑:

如果您真的担心效率,这里有一个更快的解决方案:

public void calcExponents(int max)

    int resultThree = 3;
    int resultFive = 5;

    while(resultThree < max)
    
        System.out.println(resultThree);
        if(resultFive < max)
        
            System.out.println(resultFive);
        

        resultThree *= 3;
        resultFive *= 5;
    

您也可以使用 3 和 5 参数来更进一步。

【讨论】:

【参考方案3】:

为什么不检查结果是否大于1000,如果是就跳出循环?

if(Math.pow(i,n)>=1000)
break;

【讨论】:

谢谢。这可能会解决问题,但我不觉得它是有效的。我们仍然需要在 for 循环中声明一个计数器限制。我认为限制变量比计数器更有效。【参考方案4】:

提示:

3.0   = 3^1
5.0   = 5^1
9.0   = 3^2
25.0  = 5^2 // I assume you forgot it
27.0  = 3^3
125.0 = 5^3
81.0  = 3^4
625.0 = 5^4
243.0 = 3^5
729.0 = 3^6

而 3x 总是小于 5x。所以一个循环(对于 x 部分)在循环体中有两个计算,一个用于 3,一个用于 5 应该可以完成这项工作。您只需对小于 1000 的部分使用一些条件,以避免打印 55 和 56

【讨论】:

这就是重点。我不想在 main 方法中使用条件。我希望有一个解决方案可以在局部变量本身上解决这个问题。 我不知道你的编程背景是什么,但这里有一个建议,不要想太多问题。如果您真的想“硬编码”它,请使用两个数组 3,5,3,5,3,5,3,5,3,31,1,2,2,3,3,4,4,5,6 或一系列“sysout”并完成 大声笑 :) 我正在解决初学者的问题。我承认【参考方案5】:

您可以使用单个循环,在每次迭代中检查 3 和 5 的指数,并打印小于 1000 的每个结果。

您只想确保在您的 3 超过 1000 时打破循环。

要打印整数值,您可以简单地将 Math.pow() 的结果转换为 int。

有许多不同的方法可以编写这样的算法。这是一个非常简单(未经测试)的示例:

public class Exponent         

    public static void main (String[] args) 

        int i = 1; // or start at 0 if you prefer
        // set the max value (could also be parsed from args)
        int maxValue = 1000; 

        // the break condition also increments:
        while (Math.pow(3, i++) < maxValue)  
            int x3 = (int) Math.pow(3, i);
            int x5 = (int) Math.pow(5, i);

            if (x3 < maxValue) 
                System.out.println(x3);
             

            if (x5 < maxValue) 
                System.out.println(x5);
            
        
     

【讨论】:

完美的格雷格!非常感谢。这就像魅力! Greg,说我想将范围从 1000 扩展到 2000 或 3000,这是一种有效的编码方式吗?我一直有一种印象,对于改变常量,局部变量是实现效率的最佳方式,但在这种情况下,我们必须干预方法,而不是变量。请指教 查看我上次的编辑。您可以在顶部声明一个变量,例如“maxValue”。

以上是关于Java 程序打印数字 3 和 5 的指数级数并将结果限制在 1000 以下的主要内容,如果未能解决你的问题,请参考以下文章

Prolog - 确定列表中重复的数量并将数量转换为指数

简单粗暴傅里叶级数

简单粗暴傅里叶级数

c ++为啥在指数时不打印所有元素

广义二项级数 & 广义指数级数 学习笔记

Randomizer 从向量中选择一个数字并将其删除