C語(yǔ)言完全平方數(shù)代碼如何優(yōu)化

小樊
87
2024-06-20 01:21:26

在C語(yǔ)言中判斷一個(gè)數(shù)是否為完全平方數(shù),可以通過(guò)以下代碼實(shí)現(xiàn):

#include <stdio.h>

int isPerfectSquare(int num) {
    int i = 1;
    while (num > 0) {
        num -= i;
        i += 2;
    }
    return num == 0;
}

int main() {
    int num;
    printf("請(qǐng)輸入一個(gè)整數(shù):");
    scanf("%d", &num);
    if (isPerfectSquare(num)) {
        printf("%d是一個(gè)完全平方數(shù)\n", num);
    } else {
        printf("%d不是一個(gè)完全平方數(shù)\n", num);
    }
    return 0;
}

這段代碼使用了一個(gè)循環(huán)來(lái)判斷一個(gè)數(shù)是否為完全平方數(shù),如果是完全平方數(shù),那么經(jīng)過(guò)循環(huán)后num會(huì)變成0;否則num會(huì)小于0。這種方法比較直接,但不是最優(yōu)化的方法。

另一種優(yōu)化的方法是使用二分查找的方式來(lái)判斷一個(gè)數(shù)是否為完全平方數(shù),代碼如下:

#include <stdio.h>

int isPerfectSquare(int num) {
    if (num < 0) {
        return 0;
    }
    
    int left = 0, right = num;
    while (left <= right) {
        long long mid = left + (right - left) / 2;
        long long square = mid * mid;
        
        if (square == num) {
            return 1;
        } else if (square < num) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    
    return 0;
}

int main() {
    int num;
    printf("請(qǐng)輸入一個(gè)整數(shù):");
    scanf("%d", &num);
    if (isPerfectSquare(num)) {
        printf("%d是一個(gè)完全平方數(shù)\n", num);
    } else {
        printf("%d不是一個(gè)完全平方數(shù)\n", num);
    }
    return 0;
}

這段代碼使用了二分查找的方式來(lái)判斷一個(gè)數(shù)是否為完全平方數(shù),時(shí)間復(fù)雜度為O(logn),比上一種方法更加高效。

0