整数循环节求和-华为机试题

来源:互联网 发布:php set timezone 编辑:程序博客网 时间:2024/04/30 01:22

/*
整数之循环节点求和
描述:
任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时在前面补零,类推下去,最后将变成一个固定的数: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 <iostream>#include <stdio.h>#include <algorithm>#include <vector>using namespace std;void cycNum(long long n, vector<long long>& s){    vector<long long> temp;    int size=0;    long long max=0, min=0,result;    while(n)    {        temp.push_back(n % 10);        size++;        n = n/10;    }    sort(temp.begin(), temp.end());    for(int i = 0; i < size; i++)    {       min = min * 10 + temp[i];       max = max * 10 + temp[size - i -1];    }    result = max - min;    if(result == 0)    {     cout<<"0"<<endl;     return;    }    if( find(s.begin(), s.end(), result) == s.end())    {        s.push_back(result);        cycNum(result, s);    }    else     {        vector<long long>::iterator iter = find(s.begin(), s.end(), result) ;        long long result1 =0;        for( ;iter != s.end(); iter++)        {            result1+=*iter;        }        cout<<result1<<endl;            return;    }}int main(){    long long n;    vector<long long> s;    cin>>n;    cycNum(n, s);}
0 0