PTA 6-7 統計某類完全平方數

本題要求實現一個函數,判斷任一給定整數N是否滿足條件:它是完全平方數,又至少有兩位數字相同,如144、676等。

函數接口定義:

int IsTheNumber ( const int N );

其中N是用戶傳入的參數。如果N滿足條件,則該函數必須返回1,否則返回0。

裁判測試程序樣例:

#include <stdio.h>
#include <math.h>

int IsTheNumber ( const int N );

int main()
{
    int n1, n2, i, cnt;
	
    scanf("%d %d", &n1, &n2);
    cnt = 0;
    for ( i=n1; i<=n2; i++ ) {
        if ( IsTheNumber(i) )
            cnt++;
    }
    printf("cnt = %d\n", cnt);

    return 0;
}

/* 你的代碼將被嵌在這裏 */

輸入樣例:

105 500

輸出樣例:

cnt = 6

正確版本

int IsTheNumber(const int N) {
	//判斷N是否是完全平方數
    int tmp = sqrt(N);
    if ((tmp * tmp) != N)
        return 0;
    //如果N可以開根號,那就判斷是否有重複的數字
    else
    {
        int flag[10] = { 0 }, a;
        int m = N;
        while (m) {
            a = m % 10;
            m = m / 10;
            if (flag[a])return 1;
            else 
                flag[a] = 1;
        }
        return 0}
}

解釋說明

分爲兩部分,是否是完全平方數和是否有重複數字。

是否是完全平方數:如果是完全平方數,那它開根沒有小數。這就好辦了,使用math.h裏的開根函數sqrt(),它的原型是double sqrt(double x);,返回值是double型的,轉換成int型就可以去掉小數。再通過平方值的比較,就能挑選出完全平方數。

是否有重複數字:創建一個標誌數組flag[10],用來記錄出現的數字。除10取模後的數字就是最後一位數字,例如144%10會得到4,這正是144的最後一位數字,然後標記flag[4]=1。循環後的14.4取模爲4,這與上個記錄衝突,返回1。

如果上述方案有不妥或是你有更好的方案,還望不吝賜教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章