【问题标题】:Integer square root in javajava中的整数平方根
【发布时间】:2015-12-28 18:38:33
【问题描述】:

我正在编写一个程序来获取数字的整数平方根。 我的代码:

import java.util.Scanner;
public class IntRoot{
    public static void main(String[] args){
    int num;
    System.out.print("Enter a non-negative integer: ");
    Scanner sc = new Scanner(System.in);
    num = sc.nextInt();
    int i;
    int y=1;
    for (i=1; num>=i+(i+2); i +=2){
        ++y;
    }
    System.out.print(y);
    }
}

程序应该一次加一个奇数正整数 (1+3+5+7+...),直到下一个和小于或等于 num,然后计算奇数的个数以给出整数平方根(并打印该数字)。

例如。 12 的整数平方根为 3,因为 1+3+5 = 9,和中有 3 个奇数

目前我的程序没有打印正确的数字。 "i" 应该从 1 开始,每次增加 2。这个 for 循环将重复直到“i”的下一个总和大于“num”,并且“y”每次都会增长 1,以给出“i”增长的次数。所以如果输入是7,“i”应该在y=2时停止,同样,如果输入是4,i应该在y=2时停止,如果输入是49,i应该在y=7时停止。

我的代码有问题吗?还是我的逻辑?

【问题讨论】:

    标签: java for-loop integer root


    【解决方案1】:

    你的 for 循环只是计数:

    for (i=1; num>=i+(i+2); i +=2){
        …
    }
    

    迭代 i 的值为 1, 3, 5, 7, 9, ...

    如果你想在你的循环中拥有值 1、1+3、1+3+5、1+3+5+7……,你必须这样做:

    sum = 1;
    for (i = 1; num >= sum; i += 2) {
        sum += i;
        …
    }
    

    【讨论】:

    • 如何在 while 循环中添加 i 的总和?
    【解决方案2】:

    你有一些问题,但这里有一些可行的方法

    int currSum = 0;
    int oddCount = 0;
    for(int i = 1; currSum + i <= num; i+=2) {
       currSum += i;
       oddCount++;
    }
    

    基本上这会检查currSum = 1+3+5....+i &lt; num,如果您当前的总和不大于 num,那么您将下一个奇数添加到当前总和,增加看到的奇数数量,然后再次检查。

    【讨论】:

    • 真的很喜欢这个解决方案——它非常简单,不需要任何额外的东西。谢谢! p.s.我认为您的意思是输入“currSum + i
    • 嗯,我认为条件是正确的,我的本地测试很好。是否存在不起作用的值?我试图找到一个不好的价值,但无济于事
    • 当我输入 49 时,我得到了 8
    • 啊,是的,你是对的。在本地我有oddCount = 0,但我的答案是oddCount = 1。我已经更新了。
    【解决方案3】:

    tl;dr - 跳到底部。使用 do/while 循环。


    我们如何使用 do/while 循环?我建议从您的循环中拆分“中断”条件。现在要理解正在发生的事情变得更加复杂(这可能就是你感到困惑的原因)。

    类似:

    int curSum = 0;
    for (i=1; i<num; i +=2){
        if (curSum + i >= num) {
            break;
        }
        ++y;
        curSum +=i; 
    }
    

    更加清晰。更容易阅读和理解循环逻辑中实际发生的事情。

    您可以通读 for 循环,几乎完全用英文阅读

    • “将 i 迭代为 2 的倍数(从 1 开始,因此所有奇数)。计算可以将这些相加的次数,直到当前总和加上下一个值大于输入数。”

    沿着这条线,我会建议更好的变量名:

    import java.util.Scanner;
    public class IntRoot{
        public static void main(String[] args){
            int num;
            System.out.print("Enter a non-negative integer: ");
            Scanner sc = new Scanner(System.in);
            num = sc.nextInt();
            int i;
            int iterations=1;
            int curSum = 0;
            for (i=1; i<num; i +=2){
                if (curSum + i >= num) {
                    break;
                }
                iterations++;
                curSum +=i; 
            }
    
            System.out.print(iterations);
        }
    }
    

    最后,问题是......根据您的条件,您真的“遍历每个数字直到您的输入数字吗?”答案是,“不,你想迭代直到一个条件得到满足。”

    为此有更好的循环结构,例如do-while 循环:

    import java.util.Scanner;
    public class IntRoot{
        public static void main(String[] args){
            int num;
            System.out.print("Enter a non-negative integer: ");
            Scanner sc = new Scanner(System.in);
            num = sc.nextInt();
            int i=1;
            int iterations=1;
            int curSum = 0;
            do {
                i+=2;
                iterations++;
                curSum +=i; 
            } while (curSum + i < num);
    
            System.out.print(iterations);
        }
    }
    

    【讨论】:

      【解决方案4】:

      我得到了这个工作:

      int value = 4;
      int count = 0;
      int i = 0;
      for (; count < value; i++) {
          count += i * 2 + 1; // i*2+1 == 1, 3, 5, 7, ...
      }
      
      if (count != value) i--;
      System.out.printf("The Square Root of %d is %d.\n", value, i);
      

      用任何值替换value。它完全符合您的要求。

      编辑:对不起,用 C++ 编写代码。已为 Java 修复。

      【讨论】:

        【解决方案5】:

        使用break 退出的while 循环可能会更容易。我不会说你不能让它与 for 一起工作,但我认为退出的条件是在循环内,为了更简洁的代码:

        while(true)
        {
          i += 2;
          s += i;
          if(s + i > num)
             break;
          ++y;
        }
        

        【讨论】:

          【解决方案6】:

          我将 y 的默认值更改为 0,因为在我的测试中它总是多给一个。

          int num;
          System.out.print("Enter a non-negative integer: ");
          num = 12;
          int i;
          int y=0;
          for (i=1; num>=i+(i+2); i +=2){
          
          System.out.print("Iteration " +i+"|");
              ++y;
          }
          System.out.print(y);
          }
          

          我添加了几个 s.out。

          结果是这样的。所以看起来 y=0 给出了有效值。

          输入一个非负整数:迭代 1|迭代 3|迭代 5|3

          【讨论】:

            【解决方案7】:
            public class App 
            {
                public static void main(String args[])
                {
            
                    Scanner sc=new Scanner(System.in);
                    System.out.println("enter the value :");
                    int num=sc.nextInt();
            
                    int a =num/10;//32
                    num=num%10;//1
                    int b=a/10;//3
                    int c=a%10;
                    int total=c+b+num;
                    System.out.println("The sum of digit is:" +total);
            
            
                }
            }
            

            【讨论】:

            • 欢迎来到 SO!您介意进一步解释和评论您的答案吗?这将有助于了解您的方法,并可能更容易解决未来的问题。
            • 使用java检查这个link的整数平方根,这将对你有所帮助。
            猜你喜欢
            • 2013-03-01
            • 2015-03-04
            • 2013-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多