题目介绍
——本题要求实现一个函数,判断任一给定整数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 )
{
int n = N;
int a[100]={0};
int value = sqrt(N);
if(value*value == N)
{
int d;
while(n)
{
d = n%10;
n = n/10;
a[d]++; //出现一次为对应的元素加一
if(a[d]>=2) //某一数组元素大于二,说明有相同数字
return 1;
}
}
return 0;
}
个人提交代码:
int IsTheNumber ( const int N )
{
int s[20];
int M=N;
int x=0,y=0;
for(int q=3;q<=M/2;q++)
{
if(N==q*q&&N>10)
{
x=1;}
}
int len=(int)log10(M)+1;
if(x==1)
{
for(int i=0;i<len;i++)
{
s[i]=M%10;
M=M/10;
}
for(int j=0;j<len;j++)
{
for(int p=len-1;p>j;p--)
{
if(s[j]==s[p])
y= 1;
}
}
if(y==1)
{
return 1;}
else
{
return 0;}
}
else
return 0;
}
问题总结:
1 math.h头文件中sqrt(x)函数应用不熟练。函数要求x为浮点型数据,因此在调用sqrt(x)函数时,常常涉及强制数据类型转换;sqrt(x)要求x大于0,返回值为平方根,精度取决于C语言开发环境设置的精度。如为了获得某数的平方根整数部分,方法:int value = sqrt(n);
2 使用for循环遍历所有情况以判断某种情况是否会发生时,内部语句应为if(某事发生) { x=1; } 之类的,不可继续else,否则在接下来的遍历中,x的值会被更新,出循环时,x的值为最后一次情况下的x,因此无法达到目标要求。
3 学习答案中判断同一数字出现多次的思路方法——通过循环遍历每一位数字,用某一数组不同元素存储各数字出现频率。