博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【每天一道算法题】整数循环节之和——数字黑洞6174
阅读量:7294 次
发布时间:2019-06-30

本文共 1237 字,大约阅读时间需要 4 分钟。

 

华为优招第三题,前两道题都比较简单,在这道题上卡住了。说实话不怪我,华为这道题描述有问题哦。其实不应该是较大的数,和较小的数。是最大的数和最小的数。(我在随机举例可能的数字组合上浪费了很多时间!!怒!)

整数之循环节点求和描述: 任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时在前面补零,类推下去,最后将变成一个固定的数:6174。例如:4321-1234=3087   8730-378=8352   8532-2358=6174   7641-1467=6147。  如果K位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,例如对于五位数54321: 54321-12345=41976  97641-14679=82962   98622-22689=75933     97533-33579=63954   96543-34569=61974   97641-14679=82962    我们把82962  75933  63954  61974称作循环节。在前面6174中,循环节认为只有一个数。请输出这些循环节之和,最终结果可能需要使用64位的整型才能存放。当没有循环节,输出0,例如:输入33333,输出0。运行时间限制: 无限制内存限制:   无限制输入: 输入为一个正整数,取值范围位0~0xffffffff输出: 输出为各循环节的和样例输入:   3214样例输出:   6174

那其实用递归就可以解决了。

1.拆分每一位的数到vector

2.vector排序得到最大的数、最小的数

3.递归(出口条件,差值重复出现)

代码。

#include 
#include
#include
using namespace std;void cyclesum(int num,vector
& dis){ int size=0; vector
digits; while (num!=0){ digits.push_back(num%10); size++; num/=10; } sort(digits.begin(),digits.end()); int maxnum=0,minnum=0; for(int i=0;i
>num; if(num==0) cout<<"0"<
dis; cyclesum(num,dis); return 0;}

 

转载于:https://www.cnblogs.com/LUO77/p/5770856.html

你可能感兴趣的文章
lvm快照的创建恢复
查看>>
数学之美笔记(二十)
查看>>
网站设计八步骤
查看>>
Oracle系统用户的默认密码及功能
查看>>
获取数组中的最大值
查看>>
Operation category READ is not supported in state standby
查看>>
elasticsearch 6.6 安装(CentOS 7.5) 修订
查看>>
python进阶资源整理
查看>>
对Struts2的认识(-)
查看>>
25个经典的Spring面试问答
查看>>
老男孩Linux运维第41期20171016第六周学习重点课堂记录
查看>>
负载均衡 LVS
查看>>
APACHE-TOMCAT集群环境部署
查看>>
Linux文件管理以及一些常用的基础命令解析
查看>>
SpringQuartz定时任务调度器
查看>>
开始——“运行”命令集
查看>>
配置管理篇(0)_SaltStack 安装
查看>>
如何将Windows Server域(AD活动目录)中的用户导出并导入至Outlook2010通讯簿
查看>>
Converting slapd.conf to a Directory Based Configu
查看>>
Linux中查看信息的命令
查看>>