
变幻数
发布日期:2021-05-07 06:54:54
浏览次数:15
分类:精选文章
本文共 1918 字,大约阅读时间需要 6 分钟。
变 幻 数 变幻数 变幻数
题目链接:
题目
给定一个十进制正整数 n n n,它的递归变幻数定义如下:
- 如果 n n n的位数多于 1 1 1位(忽略前置的 0 0 0),将 n n n的各个位上的数相乘,乘积为 m m m。称 m m m为 n n n的子变幻数, n n n称为 m m m的父变幻数。求一个数的变幻数等于求其子变幻数。即求 n n n的变幻数等于求 m m m的变幻数。
- 如果 n n n的位数只有一位, n n n的变幻数即为它本身。 如求 679 679 679的变幻数过程为: 679 − > 378 ( = 6 ∗ 7 ∗ 9 ) − > 168 ( = 3 ∗ 7 ∗ 8 ) − > 48 ( = 1 ∗ 6 ∗ 8 ) − > 32 ( = 4 ∗ 8 ) − > 6 ( = 2 ∗ 3 ) 679 -> 378(=6*7*9) -> 168(=3*7*8) -> 48(=1*6*8) -> 32(=4*8) -> 6(=2*3) 679−>378(=6∗7∗9)−>168(=3∗7∗8)−>48(=1∗6∗8)−>32(=4∗8)−>6(=2∗3),所以 679 679 679的变幻数为 6 6 6。
现在的问题是给定一个子变幻数 k k k,问 k k k的父变幻数最小是多少? 如: k = 18 k=18 k=18,则 k k k的父变幻数可以是 29 29 29,也可以是 92 92 92。但最小为 29 29 29。
输入
一个子变幻数 k ( k( k(位数小于 1000 ) 1000) 1000)。
输出
k k k的最小父变幻数。 当不存在父变幻数时请输出 “ T h e r e i s n o s u c h n u m b e r ! ” “There\ is\ no\ such\ number!” “There is no such number!”,输出结果不含引号。
样例输入
48
样例输出
68
思路
这道题是一道贪心题。
题目告诉我们子变幻数就是父变幻数的各个位的乘积,那么就是说如果我们把子变幻数分解成一些大于 0 0 0小于 10 10 10的数,然后按各种方法排列起来的话,组成的数都是子变幻数的父变幻数。
由于要求最小的父变幻数,那么分解出来的数肯定是从小到大排列组成。而且,我们要让最后排列出来的数尽可能小,首先要让它的位数尽可能的少,那我们其实可以尽可能的先分出 9 9 9,接着是 8 8 8,再接着是 7 7 7,以此类推一直到 2 2 2(因为所有数 / 1 /1 /1都是本身,除了只会让位数变多),接着再从小到大排列(因为这样会让数字最小),就可以了。有一点要注意的是要用高精除,因为子变幻数可以有1000位,父变幻数就更不用说了。
代码
#include#include using namespace std;int a[10], num[1001], k, an[1001];char b[1001];int main() { scanf("%s", &b);//读入 for (int i = 0; i < strlen(b); i++) { num[++k] = b[i] - 48;//转换成数字 } int i = 9;//初始化 while (i >= 2) { //分解除每一个数字(以最优的方法) int now = 0; for (int j = 1; j <= k; j++) { //高精除 now = now * 10 + num[j]; an[j] = now / i; now %= i; } if (!now) { //判断能否整除 int fr = 1; a[i]++;//可以被整除,计入答案 while (!an[fr]) fr++; for (int j = fr; j <= k; j++) num[j - fr + 1] = an[j]; k = k - fr + 1; } else i--;//不能整除 } if (k > 1) printf("There is no such number!");//不存在父变幻数 else { for (int i = 2; i <= 9; i++) for (int j = 1; j <= a[i]; j++) printf("%d", i);//输出答案 } return 0;}
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月31日 14时34分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux的s、t、i、a权限(转)
2019-03-06
zmq的send
2019-03-06
C++中的delete加深认识
2019-03-06
windows消息机制(转)
2019-03-06
STL笔试面试题总结(干货)(转)
2019-03-06
XML 和 HTML 之间的差异
2019-03-06
qt中moc的作用
2019-03-06
阿里钉钉面试题
2019-03-06
华为社招笔试
2019-03-06
MFC的Dlg和App什么区别?应用程序类与对话框类
2019-03-06
C\C++下获取系统进程或线程ID(转)
2019-03-06
VS环境变量(转)
2019-03-06
C++中找资源或者函数的方法
2019-03-06
一些留给自己的思考题(只求回过头来能够有所获)
2019-03-06
SQL函数返回表的写法
2019-03-06
delete对象时会自动调用类的析构函数
2019-03-06
C++ 子类对象直接赋值给父类对象可行,反过来不行
2019-03-06
WMWare下安装centOS7,并使用xshell进行连接记录.
2019-03-06
linux下同一个动态库名为何辣么多的.so文件
2019-03-06
SQL联表的方式(逗号, Left Join, Right Join)
2019-03-06