java 中的整数平方根

Integer square root in java

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

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,我应该在 y=2 时停止,如果输入为 49,我应该在 y=7 时停止。

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

您的 for 循环正在计算:

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

使用值为 1、3、5、7、9 的 i 进行迭代,...

如果你想在你的循环中得到值 1, 1+3, 1+3+5, 1+3+5+7, … 你必须做这样的事情:

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

你有一些错误,但这里有一些有用的东西

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

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

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


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

类似于:

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

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

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

  • "iterate i, by multiples of 2 (starting at 1, so all odd numbers). Count the number of times you can sum these until the current sum plus the next value is greater than the input number."

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

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);
    }
}

最后,问题是...鉴于你的条件,你真的"iterate over every number up to your input number?" 答案是,"no, you want to iterate until a condition is met."

有更好的循环结构,例如 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);
    }
}

我成功了:

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.

使用 break 退出的 while 循环,您可能会发现这更容易。我不会说你不能让它与 for 一起工作,但我认为退出的条件在循环内,以获得更清晰的代码:

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

我将 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 似乎给出了有效值。

Enter a non-negative integer: Iteration 1|Iteration 3|Iteration 5|3

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);


    }
}