java中的整数平方根

时间:2015-09-30 20:37:56

标签: java for-loop integer root

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

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 = 2时“i”应该停止,类似地,如果输入是4,我应该在y = 2时停止,如果输入是49,我应该在y = 7时停止。

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

7 个答案:

答案 0 :(得分:2)

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循环,几乎完全用英文阅读

  • &#34;迭代i,乘以2的倍数(从1开始,所以所有奇数)。计算可以求和的次数,直到当前总和加上下一个值大于输入数。&#34;

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

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

最后,问题是......根据您的条件,您是否真的&#34;迭代每个数字直到您的输入数字?&#34;答案是,&#34;不,你想迭代直到满足条件。&#34;

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

答案 1 :(得分:1)

你的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;
    …
}

答案 2 :(得分:0)

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

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,那么你将下一个奇数整数加到当前总和上,增加看到的奇数数,然后重新检查。 / p>

答案 3 :(得分:0)

我让这个工作:

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。

答案 4 :(得分:0)

使用while循环break循环可能会更容易。我不会说你不能使用for,但我认为退出的条件是在循环内部,以获得更清晰的代码:

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

答案 5 :(得分:0)

我将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

答案 6 :(得分:0)

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


    }
}