B1091 N-自守数 (15分)

B1091 N-自守数 (15分)

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

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

输入格式:

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

输出格式:

对每个需要检测的数字,如果它是 \(N\)-自守数就在一行中输出最小的 $N $和 \(NK ?^2\)

的值,以一个空格隔开;否则输出 No。注意题目保证 \(N<10\)。

输入样例:

3
92 5 233

输出样例:

3 25392
1 25
No

思路

对0-9逐一检验

9000000

为什么我的代码有一个测试点过不去。

因为对0所有数都会自守的,对一些特殊的数要特别看待。

#include<bits/stdc++.h>
using namespace std;

int tmp_ans[9];
int ans[9];

int change(int a[],int b){
    int num = 0;
    while(b!=0){
        a[num++]=b%10;
        b/=10;
    }
    return num;
}
int main(void){
    int m,tmp,tmp_num,num,true_ans;
    int flag;
    scanf("%d",&m);
    getchar();
    for(int i=0;i<m;i++){//对每个数都处理一次标记
        flag = -1;
        scanf("%d", &tmp);//要判断有几位数,最大是4位
        tmp_num=change(tmp_ans,tmp);
        for(int j=0;j<10;j++){
            flag = -1;
            true_ans=tmp*tmp*j;
            num=change(ans,true_ans);
            for(int k=0;k<tmp_num;k++){
                if(ans[k]!=tmp_ans[k]){
                    flag = k;
                    break;
                }
            }
            if(flag==-1){
                printf("%d %d\n",j,true_ans);
                break;
            }
        }
        if(flag!=-1)
            printf("No\n");/*无自守数*/
    }
    return 0;
}

AC代码

/*消去0这个自守。*/
for(int j=1;j<10;j++)

来自别人的AC代码

不是暴力而是数学的写法。

作者:dk_qi

链接:https://www.jianshu.com/p/c59448ce5414

以题中\(3×92^2=25392\)为例,当数\(K\)为\(92\),自守数\(N\)为\(3\)时,有\((3×92×92-92)% 100 = 0\)。推广即得

/[(NKK-K)%(10^{length(K)})=0]/

#include<stdio.h>

int len(int K);    //该函数返回10的K的长度次方。

int main()
{
    int M, K, l, flag;
    scanf("%d", &M);
    for(int i = 0; i < M; i++){
        scanf("%d", &K);
        l = len(K);
        flag = 0;    // flag标记K是否有自守数
        for(int j = 0; j < 10; j++){
            if((j * K * K - K) % l == 0){
                printf("%d %d\n", j, j*K*K);
                flag = 1;
                break;  //得到最小自守数后直接break
            }
        }
        if(flag == 0)    printf("No\n");
    }
    return 0;
}

int len(int K){
    int len = 1;
    while(K){
        len *= 10;
        K /= 10;
    }
    return len;
}

原文地址:https://www.cnblogs.com/lingr7/p/10296029.html

时间: 2024-10-13 05:56:17

B1091 N-自守数 (15分)的相关文章

1091 N-自守数 (15分)

如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数. 输入格式: 输入在第一行中给出正整数 M(≤),随后一行给出 M 个待检测的.不超过 1000 的正整数. 输出格式: 对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 NK?2?? 的值,以一个空格隔开:否则输出 No.注意题目保证 0

1091 N-自守数 (15 分)

// 建一个判断函数,接受两个整形的变量,再通过循环按位判断相等与否,主体函数中调用被调函数,建立一个判断变量.#include <iostream> using namespace std; bool cmp (int x, int k) { while (k != 0) { int t1 = x % 10; int t2 = k % 10; if (t1 != t2) return false; x /= 10; k /= 10; } return true; } int main() {

7-6 求整数序列中出现次数最多的数 (15 分)

7-6 求整数序列中出现次数最多的数 (15 分) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3 0 3 2 输出样例: 3 4 s = input().split()[1:] count_max = 0 for i in set(s

第4章-6.输出前 n 个Fibonacci数 (15分)

本题要求编写程序,输出菲波那契(Fibonacci)数列的前N项,每行输出5个,题目保证输出结果在长整型范围内. Fibonacci数列就是满足任一项数字是前两项的和 (最开始两项均定义为1)的数列 例如:1,1,2,3,5,8,13,.... 输入格式: 输入在一行中给出一个整数N(1≤N≤46). 输出格式: 输出前N个Fibonacci数,每个数占11位,每行输出5个.如果最后一行输出的个数不到5个,也需要换行. 如果N小于1,则输出"Invalid." 输入样例1: 7 输出样

PAT 乙级 1091 N-自守数 (15 分)

1091 N-自守数 (15 分) 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为"N-自守数".例如 3×92?2??=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数. 本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数. 输入格式: 输入在第一行中给出正整数 M(≤20),随后一行给出 M 个待检测的.不超过 1000 的正整数. 输出格式: 对每个需要检测的数字,如果它是 N-自守数就在一行中

算法15---数论4---自守数

算法15---数论4---自守数 如果一个正整数的平方的末尾几位数等于这个数本身,那么这个数便称为自守数. 自守数有如下的一些性质 (1) 以自守数为后几位的两数相乘,结果的后几位仍是自守数: (2) n+1位的自守数出自n为的自守数. (3) 两个n位子守数的和等于10的n次方加1. 我们给出两种自守数的算法 1 /* 2 题目:自守数 3 author taoliu——alex 2016.10 4 5 主要实现: 6 判断自守数: 7 8 */ 9 10 11 #include <stdio

1001 害死人不偿命的(3n+1)猜想 (15)(15 分)

1001 害死人不偿命的(3n+1)猜想 (15)(15 分) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展-- 我们今天的题目不是证明卡

[PAT B1036]跟奥巴马一起编程(15分)

1036 跟奥巴马一起编程(15)(15 分) 美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝"计算机科学教育周"正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形.现在你也跟他一起画吧! 输入格式:输入在一行中给出正方形边长N(3<=N<=20)和组成正方形边的某种字符C,间隔一个空格. 输出格式:输出由给定字符C画出的正方形.但是注意到行间距比列间距大,所以为了让结果看上去更像正方形

B1061 判断题 (15分)

B1061 判断题 (15分) 判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量.第二行给出 M 个不超过 5 的正整数,是每道题的满分值.第三行给出每道题对应的正确答案,0 代表"非",1 代表"是".随后 N 行,每行给出一个学生的解答.数字间均以空格分隔. 输出格式: 按照输入的顺序输出每个学生的得分,每个分数占一行. 输入样例