java-判断一个自然数是否是某个数的平方。当然不能使用开方运算



public class SquareRoot {

/**
* 题目:判断一个自然数是否是某个数的平方。当然不能使用开方运算
* 方法1.squareRoot0 二分查找
* 方法2.squareRoot1
* 考虑等差数列 1 3 5 7 9...发现
* 1^2=1
* 2^2=1+3
* 3^2=1+3+5
* ...
* 因此,N-1-3-5...若刚好可减至0,则N是某正整数的平方
*/

public static void main(String[] args) {
for(int i=0;i<100;i++){
squareRootOf(i);
}
}

public static void squareRootOf(int n){
if(n<1){
return;
}
int x0=squareRoot0(n);
if(x0!=-1){
System.out.printf("%d*%d=%d%n", x0,x0,n);
}

int x1=squareRoot1(n);
if(x1!=-1){
System.out.printf("%d*%d=%d%n", x1,x1,n);
}
}

//return sqrt(n).Use binary search
public static int squareRoot0(int n){
int low=1;
int high=n;
while(low<=high){
int mid=(low&high)+(high^low)/2;
if(mid*mid==n){//mid*mid,overflow? I don't know how to avoid this.
return mid;
}else if(mid*mid<n){
low=mid+1;
}else{
high=mid-1;
}
}
return -1;
}

//return sqrt(n).
public static int squareRoot1(int n){
int d=1;//d=1,3,5...
int count=0;
while(n>0){
n-=d;
d+=2;
count++;
if(n==0){
return count;
}
}
return -1;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用递归函判断一个自然数是否为素。具体实现方法如下: 1. 定义一个递归函is_prime(n),用来判断自然数n是否为素。 2. 判断n是否小于等于1,如果是,则返回,表示不是素。 3. 判断n是否等于2,如果是,则返回1,表示是素。 4. 判断n是否能被2整除,如果是,则返回,表示不是素。 5. 定义一个变量i,从3开始,每次增加2,判断n是否能被i整除,如果是,则返回,表示不是素。 6. 如果i的平方大于n,则返回1,表示是素。 7. 在is_prime函中调用自身,传入参n和i+2,继续判断n是否能被i+2整除。 8. 如果is_prime函返回1,则表示n是素,返回1;否则返回,表示不是素。 下面是具体的代码实现: int is_prime(int n, int i) { if (n <= 1) { return ; } if (n == 2) { return 1; } if (n % 2 == ) { return ; } if (i * i > n) { return 1; } if (n % i == ) { return ; } return is_prime(n, i + 2); } int main() { int n; printf("请输入一个自然数:"); scanf("%d", &n); if (is_prime(n, 3) == 1) { printf("%d是素\n", n); } else { printf("%d不是素\n", n); } return ; } ### 回答2: 递归是一种解决问题的方法,通过自己调用自己来解决更复杂的问题。使用递归函判断一个自然数是否为素可以通过以下方法实现: 1. 首先,定义一个判断一个是否为素,函名为 is_prime,参为 n,返回值为 0 或 1。 2. 在函 is_prime 中,我们需要判断 n 是否为 1,如果是,则返回 0,否则继续执行。 3. 然后,我们需要判断 n 是否为 2,如果是,则返回 1,否则继续执行。 4. 接下来,我们需要利用一个循环,将 2 到 n-1 的依次除以 n,如果存在一个能够整除 n,则返回 0,否则返回 1。 5. 最后,我们需要在函外部调用该函,并将需要判断自然数传递给函 is_prime。 例如,我们需要判断值为 5 是否为素,可以通过以下代码实现: ```python def is_prime(n): if n == 1: return 0 elif n == 2: return 1 else: for i in range(2, n): if n % i == 0: return 0 return 1 n = 5 print(is_prime(n)) ``` 该代码中,函 is_prime 的实现方式为递归调用,通过判断 n 是否为 1 或 2,或者使用一个循环来判断是否为素。我们将值 5 传递给 is_prime 函,并输出返回值,最终输出结果为 1,表示值 5 是一个。 ### 回答3: 递归函可以用来判断一个自然数是否为素。素是只能被1和自身整除的自然数,所以我们可以从2开始尝试整除这个,如果能整除,那么这个就不是素,如果不能整除,那么这个就是素。 以下是使用递归函判断一个自然数是否为素的代码: ``` def is_prime(n, i=2): """ 判断一个自然数n是否为素 :param n: 自然数 :param i: 从2开始尝试整除n :return: 0表示不是素,1表示是素 """ if n <= 1: return 0 elif n == 2 or i >= int(n**0.5)+1: return 1 elif n%i == 0: return 0 else: return is_prime(n, i+1) ``` 在这个函中,如果字n小于等于1,那么它不是素,返回0;如果n等于2,那么它是素,返回1。然后从2开始尝试整除n,如果n能被i整除,那么n不是素,返回0;如果i已经大于n的平方根加1,那么n是素,返回1;否则,继续用i加1的值来判断n是否是,直到n被判断为素或者非素。 例如: ``` >>> is_prime(17) 1 >>> is_prime(20) 0 ``` 因为17是素,所以返回1;而20不是素,返回0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值