c语言 判断某一位上是否有7,【PTA—6-7 统计某类完全平方数】本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。...

本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。

函数接口定义:

int IsTheNumber ( const int N );

其中N是用户传入的参数。如果N满足条件,则该函数必须返回1,否则返回0。

裁判测试程序样例:

#include #include 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

我的解题思路如下:

1.获取到N的每一位,存到数组中

2.两次循环遍历数组,判断是否有相同的数组

3.若有两个相同的数字的时候,然后接着判断N是否是完全平方数

4.根据判断返回1或0

贴出我的解题代码如下:

int IsTheNumber(const int N)

{

int M=N;//因为给的N是const修饰,无法修改,所以将M=N,用于获取每一位数字

int i,j=0;

int a[10];//定义存储每一位数字的数组

while(M>=10)

{

a[j++]=M%10;//将除最高位之外的每一位数字存储到数组中

M=M/10;

}

a[j]=M;//最后将最高的那位数字存储到数组中

int x=(int)sqrt(N);//将N开平方时候强转成int

int y=x*x;//计算x的平方

int m,n;

for(m=0; m<=j; m++)

{

for(n=m+1; n<=j; n++)

{

//两次循环数组,注意n是从m+1开始的,也就是只与其后边的比较即可

if(a[m]==a[n])//如果出现了一组相同的数字

{

if(y==N)//然后判断N是否是完全平方数

{

return 1;//直接就返回1

}

else

{

return 0;

}

}

}

}

return 0;

}

解释一下代码中判断完全平方数的做法:

就拿133这个数来说,因为将其开平方之后是得不到整数的,那么(int)sqrt(133)=11,而11*11不等于133,从而这就判断出来不是完全平方数;而对于144而言,(int)sqrt(144)得到的就是12,从而就可以判断出其就是完全平方数=。=

还有一点:

在判断是否是完全平方数的时候,最直接想到的方法是:通过for循环遍历1—N/2这个区间,如下:

for(i=1;i<=N/2;i++){

if(i * i == N){

return 1;

}

}

就本题而言,使用这种方式是可以通过检测的(得20分)

但是大家一看就知道,耗时很多,没错,我试了一下16ms

所以说,如果遇到了要求时间运行更严格的要求的话,就需要使用贴出来的代码上的那种方法,2ms=。=

就这个判断是否是完全平方数这点做个小总结吧:

在判断一个数是否是完全平方数的时候(如:144=12*12):

1.首先想到的是通过循环遍历到n/2,然后进行判断 i*i==n,这是最常见的办法,但是消耗的时间会很长,在刷算法题的时候可能会出现运行超时的错误

2.通过引入math.h头文件后,再进行判断

int x=(int)sqrt(N)

int y=x*x

if(y==N){

就说明这个数是完全平方数

}

我是小K,算法这块有着很大的短板,所以现在正在慢慢恶补,若以上解释有不当之处,路过的朋友还请多多请教=。=

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值