您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 机试 C++