[算法-模拟] 4,7幸运数字

作者: Quasars | 来源:发表于2016-09-12 18:19 被阅读142次

有一群矮人,他们的通信方式只有4和7. 他们的数字自然也只有4和7组成.例如,1 ~10他们表示为

1  4
2  7
3  44
4  47
5  74
6  77
7  444
8  447
9  474
10 477
...

现在要求给定一个地球人的数字N(1<= N <= 10 ^ 18),求矮人族中对应的表达.
如,
输入 5
输出 74
输入 100000000000
输出 477747447444477747747774744444444447

解法

  • 思路1. 二叉树广度优先遍历, 只针对小规模数字.

  • 解法如下:

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <string>
  4 #include <queue>
  5
  6 using namespace std;
  7
  8 queue<string> q;
  9 string ss;
 10 unsigned long long N;//1 ~ 10 ^ 18
 11
 12 void next()
 13 {
 14     unsigned long long Ptime = 1;
 15     unsigned long long pi;
 16     while(N){
 17         pi = Ptime;
 18         while(pi){
 19             string tmp = q.front();
 20             q.pop();
 21             pi--;
 22
 23             tmp += "4";
 24             q.push(tmp);
 25             N--;
 26
 27             if(0 == N){
 28                 cout << tmp << endl;
 29                 return;
 30             }
 31
 32             tmp[tmp.size()-1] = '7';
 33             q.push(tmp);
 34             N--;
 35             if(0 == N){
 36                 cout << tmp << endl;
 37                 return;
 38             }
 39         };
 40         Ptime = Ptime << 1;
 41     }
 42 }
 43
 44 int main()
 45 {
 46     scanf("%llu", &N);
 47     q.push(string(""));//null-string
 48     next();
 49     return 0;
 50 }

在这个思路的启发下,有思路二.

  • 思路2,(真正的解法).观察可得出,在一定长度下,4对应着二进制0,7对应着二进制1,只需求得每次相同长度下的第一个数,(通过求二叉树前k层节点总数可求得),N减去该数字,然后按位进行计算,0对应4, 1对应7
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <string>
  4
  5 unsigned long long N;
  6 void next()
  7 {
  8     unsigned long long sum = 0;
  9     unsigned long long base = 1;
 10     int bitsum = 0;
 11     while(sum < N){
 12         base *= 2;
 13         sum += base;
 14         bitsum++;
 15     };
 16     sum -= base;
 17
 18     //printf("%llu\n", sum + 1);
 19     N -= (sum + 1);
 20     std::string ss(bitsum, '4');
 21     int biti = 0;
 22     //printf(" N-sum %llu\n", N);
 23     /*printf("====\n");
 24     while(N){
 25         printf("%d",(N & 1) ? 1 : 0);
 26         N = N >> 1;
 27     }
 28     printf("\n");
 29     */
 30     while(N)
 31     {
 32         if(N & 1){
 33             ss[ss.size() - 1 - biti] = '7';
 34         }
 35         N = N >> 1;
 36         biti++;
 37     }
 38     std::cout << ss << std::endl;
 39 }
 40
 41
 42
 43 int main()
 44 {
 45     scanf("%llu", &N);
 46     next();
 47     return 0;
 48 }

运行结果,

work@vm1:~$ ./test47(第一种思路)
100
744747
work@vm1:~$ ./test472(第二种思路)
100
744747
work@vm1:~$ ./test47
100000000
^C(超时)
work@vm1:~$ ./test472(大规模情况下不超时)
100000000000
477747447444477747747774744444444447

相关文章

  • [算法-模拟] 4,7幸运数字

    有一群矮人,他们的通信方式只有4和7. 他们的数字自然也只有4和7组成.例如,1 ~10他们表示为 现在要求给定一...

  • 2020 蓝桥杯大学 B 组模拟赛(五)

    1、数字操作 答案:996 算法分析 直接模拟 Java 代码 2、字符串操作 算法分析 说白了就是贪心的思想,尽...

  • 第六章 更多监督训练

    介绍Lunar Lander示例 监督训练没有训练集 使用遗传算法 使用模拟退火算法 遗传算法和模拟退火算法的训练...

  • 数学建模

    1.启发式算法 它主要包括禁忌搜索,模拟退火,遗传算法,神经网络,蚁群算法 模拟退火算法 Metropolis准则...

  • Simulated Annealing (SA) Algorit

    1 模拟退火算法(Simulated Annealing Algorithm)介绍    模拟退火算法是一种通用概...

  • 猪都能飞起来才算风口,AI是猪吗?

    ​​​ 近年来,随着一系列基础算法的快速突破,如模拟人类思维的神经网络算法,遗传算法,强化学习算法,模拟退火算法,...

  • 模数转换模块器的A/D转换器的工作原理

    模数转换是将模拟输入信号转换为N位二进制数字输出信号的技术。采用数字信号处理能够方便实现各种先进的自适应算法,完成...

  • TSP问题—蚁群算法(ACO)

    TSP问题—蚁群算法(ACO) 蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法,它是由意大利学者Dorigo...

  • 2018-11-14

    昨天学习了模拟退火算法以及一个小智力题:海盗分赃~ 模拟退火算法前先看了爬山算法,爬山算法是一种简单的贪心搜索算法...

  • 数学建模最常用的数学算法

    1、蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的...

网友评论

    本文标题:[算法-模拟] 4,7幸运数字

    本文链接:https://www.haomeiwen.com/subject/lfgpettx.html