本題要求實現一個函數,判斷任一給定整數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。
如果上述方案有不妥或是你有更好的方案,還望不吝賜教。