2016 华为机试题之整数循环节求和
2016-04-10 21:15
225 查看
今年机试的第三道,输入一个数,定义一种操作:将各个十进制位按大小排序,从大到小排序组成的数字减去从小到大排序组成的数字,得到一个新的数字。
输入的每个数字都必然存在一种循环:对得到的数字进行若干次操作以后,会有之前已经出现过的数字。
题目要求输出以此数字循环中所有数字的和(可能会超过int 的范围,所以要用64位整数)
解题思路:用map记录已经出现过的数字,当找到第一个重复的数字,记录下来,重新开始题中定义的操作,直到该数字又一次出现。过程中将得到的数字累加,最后输出结果。
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<map>
using namespace std;
int a[66],b[66];
long long getNext(long long n,int len){
if(n==0 ) return 0;
long long big=0,small=0;
for(int i=0;i<len;i++)
{
a[i]= n%10;
n/=10;
}
sort(a,a+len);
for(int i=0;i<len;i++){
small = small*10+a[i];
}
for(int i= len-1;i>=0;i--){
big = big *10 +a[i];
}
return big -small;
}
int main() {
long long n;
while (cin>>n) {
int k =0 ;
int t = n;
while(t){
t/=10;
k++;
}
map<long long ,bool > mp;
mp.clear();
while(mp.find( n )==mp.end()){
mp
=true;
n= getNext(n,k);
}//n occur again break;
long long bgn = n;
if(n==0){
cout<<"0\n";
continue;
}
long long ans =0;
ans += bgn;
bgn = getNext(bgn,k);
while(bgn!=n ){
ans+=bgn;
bgn = getNext(bgn,k);
}
cout<<ans<<endl;
}
return 0;
}
4000
输入的每个数字都必然存在一种循环:对得到的数字进行若干次操作以后,会有之前已经出现过的数字。
题目要求输出以此数字循环中所有数字的和(可能会超过int 的范围,所以要用64位整数)
解题思路:用map记录已经出现过的数字,当找到第一个重复的数字,记录下来,重新开始题中定义的操作,直到该数字又一次出现。过程中将得到的数字累加,最后输出结果。
#include<iostream>
#include<cstring>
#include<set>
#include<algorithm>
#include<cstdio>
#include<stack>
#include<map>
using namespace std;
int a[66],b[66];
long long getNext(long long n,int len){
if(n==0 ) return 0;
long long big=0,small=0;
for(int i=0;i<len;i++)
{
a[i]= n%10;
n/=10;
}
sort(a,a+len);
for(int i=0;i<len;i++){
small = small*10+a[i];
}
for(int i= len-1;i>=0;i--){
big = big *10 +a[i];
}
return big -small;
}
int main() {
long long n;
while (cin>>n) {
int k =0 ;
int t = n;
while(t){
t/=10;
k++;
}
map<long long ,bool > mp;
mp.clear();
while(mp.find( n )==mp.end()){
mp
=true;
n= getNext(n,k);
}//n occur again break;
long long bgn = n;
if(n==0){
cout<<"0\n";
continue;
}
long long ans =0;
ans += bgn;
bgn = getNext(bgn,k);
while(bgn!=n ){
ans+=bgn;
bgn = getNext(bgn,k);
}
cout<<ans<<endl;
}
return 0;
}
4000
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 华为路由器密码恢复
- 华为交换机的后缀详解
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例