PAT (Basic Level) Practice (中文)1091 N-自守数

时间:2022-07-24
本文章向大家介绍PAT (Basic Level) Practice (中文)1091 N-自守数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1091 N-自守数

如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”。例如 3×922=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数。

本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数。

输入格式:

输入在第一行中给出正整数 M(≤20),随后一行给出 M 个待检测的、不超过 1000 的正整数。

输出格式:

对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 NK2 的值,以一个空格隔开;否则输出 No。注意题目保证 N<10。

输入样例:

3 92 5 233

输出样例:

3 25392 1 25 No

代码:

#include<stdio.h>
int fun(int K)
{
    int wei=fun_1(K);
  //  printf("wei==%dn",wei);
    int N;
    int l=1;
    for(N=1;N<10;N++)
    {
        int p=fun_2(N*K*K,wei);
       // printf("p==%dn",p);
        if(p==K) {
            l=0;
            //printf("%d %dn",N,N*K*K);
            break;
        }
    }
    if(l==1) return -1;
    else return N;
}
int fun_1(int n)
{
    int temp=0;
    while(n)
    {
        n/=10;
        temp++;
    }
    return temp;
}

int fun_2(int n,int wei)
{
    int i=1;
    int t=0;
    int sum=0;
    int *arr=(int*)malloc(sizeof(int)*wei);
    while(i<=wei)
    {
        int temp=n%10;
        arr[t++]=temp;
        n/=10;
        i++;
    }
    for(i=t-1;i>=0;i--)
        sum=sum*10+arr[i];
    return sum;
}
int main()
{
    int M;
    int Ki[22];
    int i;
    scanf("%d",&M);
    for(i=0;i<M;i++)
    {
        scanf("%d",&Ki[i]);
    }
    for(i=0;i<M;i++)
    {
        int t=fun(Ki[i]);
        if(t<0) printf("Non");
        else printf("%d %dn",t,t*Ki[i]*Ki[i]);
    }
    return 0;
}