c语言pat基础题改错

img


#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;
}

/* 你的代码将被嵌在这里 */

我的答案如下

int IsTheNumber ( const int N ){
    if(sqrt(N)*sqrt[N]==N){
        int t=N;
        int arr[];
        int c=0;
        int flag=0;
        for(int i=0;t!=0;i++){
            arr[i]=t%10;
            t=t/10;
            c++;
        }
        for(int i=0;i<c;i++){
            for(int j=i;j<c;j++){
                if(arr[i]==arr[j]){
                    flag=1;
                    break;
                }
            }
        }
        if(flag!=0){
            return 1;
        }else{
            return 0;
        }
    }else{
        return 0;
    }
}

img

希望可以给出更正和指导。

首先sqrt后面得用小括号,你用的中括号是不对的。还有数组是一个固定的值,你数组大小呢?
还有我帮你优化了一下算法

 
#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;
}
 
/* 你的代码将被嵌在这里 */
int IsTheNumber ( const int N ){
    int a=sqrt(N);
    if(a*a==N){
        int t=N;
        int arr[10]={0};//这里 
        //这里 
        while(t!=0)
        {
            arr[t%10]++;
            t/=10;
        } 
        //这里 
        for(int i=0;i<10;i++){
            if(arr[i]>=2){
                return 1;
            }
        }
        return 0;
    }
    else{
        return 0;
    }
}
 

if(sqrt(N)*sqrt[N]==N){
第二个sqrt后面用小括号啊
int arr[];要指定数组大小的啊

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7509913
  • 这篇博客你也可以参考下:PAT题库代码(个人版本)~~持续更新,持续改进!
  • 除此之外, 这篇博客: C语言 全排列的实现中的 首先是一维数组的全排列,半个多月前在PAT上做了一个题,深有体会,可以深入理解递归这东西。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    -----------------------------------------------------------------------------------------------------------------

    请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

修改如下,供参考:

/* 你的代码将被嵌在这里 */
int IsTheNumber(const int N) 
{
    int n = N, number[10] = { 0 };
    int m = (int)sqrt(n);
    if (m * m == n) {
        while (n) {
            number[n % 10]++;
            n /= 10;
        }
        for (int i = 0; i <= 9; i++) {
            if (number[i] > 1)
                return 1;
        }
    }
    return 0;
}