pat basic 1104 天长地久
“天长地久数”是指一个 K 位正整数 A,其满足条件为:A 的各位数字之和为 m,A+1 的各位数字之和为 n,且 m 与 n 的最大公约数是一个大于 2 的素数。本题就请你找出这些天长地久数。
输入格式:
输入在第一行给出正整数 N(≤5),随后 N 行,每行给出一对 K(3<K<10)和 m(1<m<90),其含义如题面所述。
输出格式:
对每一对输入的 K 和 m,首先在一行中输出 Case X
,其中 X
是输出的编号(从 1 开始);然后一行输出对应的 n 和 A,数字间以空格分隔。如果解不唯一,则每组解占一行,按 n 的递增序输出;若仍不唯一,则按 A 的递增序输出。若解不存在,则在一行中输出 No Solution
。
输入样例:
2
6 45
7 80
输出样例:
Case 1
10 189999
10 279999
10 369999
10 459999
10 549999
10 639999
10 729999
10 819999
10 909999
Case 2
No Solution
解题思路:
这道题可把我给坑惨了。刚看到的时候初步估计了一下计算量,如果K取最大值的话要算接近10亿次,所以直接放弃了暴力。当我花了大半天时间绞尽脑汁思索如何缩小遍历范围,却又没有结果,开始在网上求助大佬的时候,发现大佬们都在提示可以用暴力……
在自己机器上测试的时候先不考虑时间把所有结果打印出来看看,发现后几位数都是9,所以只需把9取出来只遍历前面的部分就大大减少运行时间了。在m=45,56的时候,后面都是9999,m=34的时候只有99。没有发现3个9的情况,所以我瞎猜,m<45的时候都是99,else都是9999。然后按照这个思路去做,测试点3就翻车了,看来只能提取99,不能提多了。
然后测试点2还翻车了一次,因为没有按n排序,解决掉这个问题后就正确了。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXN 10000typedef struct node *PtrN;
typedef struct node {int n, A;
} Answer;bool isPrime(int n) {if ( n < 2 ) return false;for ( int i=2; i*i<=n; ++i )if ( n % i == 0 ) return false;return true;
}int gcd(int a, int b) {return ( b%a==0 ? a : gcd(b%a, a) );
}int getDigitSum(int n) {int sum = 0;while ( n ) {sum += n % 10;n /= 10;}return sum;
}int compare(const void *a, const void *b) {PtrN pa = (PtrN)a, pb = (PtrN)b;return pa->n - pb->n;
}int main(int argc, const char *argv[]) {int N, A, a, K, m, n, i, j, factor, end, loop_end;Answer ans[MAXN];if ( scanf("%d", &N)==EOF ) printf("error\n");for ( i=1; i<=N; ++i ) {if ( scanf("%d %d", &K, &m)==EOF ) printf("error\n");printf("Case %d\n", i);if ( K * 9 <= m ) {printf("No Solution\n");} else {loop_end = pow(10, K-2);for ( end=0, a=loop_end/10; a<loop_end; ++a ) {A = a*100 + 99;if ( getDigitSum(A) == m ) {n = getDigitSum(A+1);factor = gcd(m, n);if ( factor > 2 && isPrime(factor) ) {ans[end].n = n;ans[end++].A = A;}}}if ( end ) {qsort(ans, end, sizeof(ans[0]), compare);for ( j=0; j<end; ++j )printf("%d %d\n", ans[j].n, ans[j].A);} else {printf("No Solution\n");}}}return EXIT_SUCCESS;
}
pat basic 1104 天长地久相关推荐
- PAT乙级“1104 天长地久”DFS优化思路
本文介绍了笔者对于B1104的优化思路,AC代码在文末Case3 如果您没有做出答案,笔者强烈建议你按需阅读Case1-3,在看完之后自己动手写一遍代码,自己思考优化思路,并动手实现,本文只起到一个抛 ...
- 「PAT乙级真题解析」Basic Level 1104 天长地久 (问题分析+完整步骤+伪代码描述+提交通过代码)
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范.从小白开始逐步掌握用编程解决问题. PAT (Basic Level) Practice 1104 天长地久 问题分析 题设要求 ...
- PAT 1104 天长地久 (20 分) C语言
这个题目的关键在于对代码的简化,很容易就超时,所以一定要尽可能简化,我的简化思路放在文章最后,欢迎参考与指正. 题目: 1104 天长地久 (20 分) "天长地久数"是指一个 K ...
- PAT (Basic Level) Practice (中文)题目集合
1001 害死人不偿命的(3n+1)猜想 (15 分) #include<bits/stdc++.h> using namespace std;int n, ans; int main() ...
- PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)
PAT (Basic Level) Practise (中文)-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 ...
- PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:本题题意比较简单,但是不能仅仅根据定义来算. 本题思路:统计每个数在多少个区间出现过,也就是这个数需要加多少次.共有n个数,其中第i个 ...
- PAT (Basic Level) Practice (中文)答案合集
准备复试专用,目标刷完全部中文题! 1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ...
- PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20)
PAT (Basic Level) Practise (中文)-1034. 有理数四则运算(20) http://www.patest.cn/contests/pat-b-practise/1034 ...
- 【题解】PAT (Basic Level) Practice (中文)
互联网行业的小白,写博客的目的是为了记录自己的学习过程.对自己学习中所犯的错误做一个总结.由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教! PAT Basic Level P ...
最新文章
- STC89C52RC片内资源介绍
- Linux下root密码丢失和运行级别错误的解决办法
- 移植opencv3.20到3556AV100
- 【剑指offer】面试题30:包含min函数的栈
- 对象存储 OSS > 开发指南 > 存储类型 > 存储类型介绍
- 新Attention | NAM,一种新的注意力计算方式,无需额外的参数
- linux下关于程序性能和系统性能的工具、方法
- c语言读一字节程序,C语言读写二进制文件
- 计算机系统注册表文件格式,WIN7系统中,如何在注册表中修改系统时间格式?...
- php varbinary,MySQL 数据类型binary和varbinary的简单示例
- 单片机跑马灯程序c语言,用单片机编写几种跑马灯程序
- 机器学习专有名词归纳
- 学习笔记28(凹凸贴图,法线贴图,位移贴图)
- Django 1.4 Python 2.7菜鸟入门
- Android 录制视频添加时间水印,不吃透都对不起自己
- Codeforces D. Powerful array(莫队)
- PKI_商用密码通用产品名单(共386项)
- [Data Structure] 数据结构中各种树
- 坚石加密锁应用方法技巧简介
- WinDebug 调试工具-0