Algorithm --> 6174问题

6174问题

假设一个各位数字不相同的四位数,把所有数字从大到小排序后得到a, 从小到大排序后得到b,然后用a-b替换原来这个数,继续操作。例如,从1234出发,依次有4321-1234=3078,8730-378=8352,8532-2358=6174,7641-1467=6174,回到了自己。

输入一个n位数,输出操作序列知道出现循环。

样例输入:1234
样例输出:1234 -> 3078 -> 8352 -> 6174 -> 6174

程序:

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;

int num[2000];
int cnt;
bool found;

int getNext(int n)
{
    int a, b;
    char s[10], t;
    sprintf(s, "%d", n);  //将整数打印成字符串保存到s中
    int len = strlen(s);
    for(int i =  0; i < len; i++)
    {
        for(int j = i + 1; j < len; j++)
        {
            if(s[i] > s[j])
            {
                t = s[i]; s[i] = s[j]; s[j] = t;
            }
        }
    }
    sscanf(s, "%d", &a);  //从s中读入数据

    for(int i = 0 ; i < len / 2; i++)
    {
        t = s[i]; s[i] = s[len - 1 - i]; s[len - 1 - i] = t;
    }
    sscanf(s, "%d", &b);

    return b - a;
}

int main()
{
    cin >> num[0];
    cout << num[0];

    cnt = 1;
    while(true)
    {
        num[cnt] = getNext(num[cnt - 1]);
        cout << " -> " << num[cnt];
        found = false;
        for(int i = 0; i < cnt; i++)
        {
            if(num[i] == num[cnt])
            {
                found = true;
                break;
            }
        }
        if(found) break;
        cnt++;
    }
    cout << endl;
    return 0;
}
时间: 2024-10-29 22:09:54

Algorithm --> 6174问题的相关文章

6174

6174问题 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2 描述 假 设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从 1234出发,依次可以得到4321-1234=3087.8730-378=8352.8532-2358=6174,又回到了它自己!现在要你写一个 程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数 比如输入1234执行顺序是1234->3

【每天一道算法题】整数循环节之和——数字黑洞6174

华为优招第三题,前两道题都比较简单,在这道题上卡住了.说实话不怪我,华为这道题描述有问题哦.其实不应该是较大的数,和较小的数.是最大的数和最小的数.(我在随机举例可能的数字组合上浪费了很多时间!!怒!) 整数之循环节点求和 描述: 任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时在前面补零,类推下去,最后将变成一个固定的数:6174. 例如:4321-1234=3087 8730-378=8352 853

NYOJ 57 6174问题

啊哈!初次知道6174,还是在高中时,一本科普书上讲的.作为回忆,就把这道题AC了. 水题,不过去掉下面的注释,可以很直观的看到过程. 最后!!!为什么我用memset函数总是忘写#include<cstring>头文件!!! 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从1234出发,依次可以得到4321-1234=308

5.3.1 6174问题

假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从1234出发,依次可以得到4321-1234=3087.8730-378=8352.8532-2358=6174.7641-1467=6174.有趣的是,最后回到了自己.要求:输入一个n位数,输出操纵序列,直到出现循环(即新得到的数曾经得到过).输入保证在循环之前最多只会产生1000个整数.样例输入:1234样例输出:1234 -> 3087 -> 83

NYOJ_51 6174问题

题目地址 分析: 以后排序直接用库函数提供的sort很方便. 核心问题在于需要把一个数拆开排序. 其实在判断的时候直接判断6174即可,不需要判断是否和前一个数字相等. 心得: 水题需要锻炼自己的速度. 代码实现: #include<iostream> #include<algorithm> using namespace std; void ReverseMinus(int &a0) { int temp1,temp2; int *t = new int [4]; t[0

6174问题(南阳oj57)

6174问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从1234出发,依次可以得到4321-1234=3087.8730-378=8352.8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数 比如输入1234执行顺序是1234->3087->

ACM - 6174问题

6174问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从1234出发,依次可以得到4321-1234=3087.8730-378=8352.8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数 比如输入1234执行顺序是1234->3087->

PLA Percentron Learning Algorithm #台大 Machine learning #

Percentron Learning Algorithm 于垃圾邮件的鉴别 这里肯定会预先给定一个关于垃圾邮件词汇的集合(keyword set),然后根据四组不通过的输入样本里面垃圾词汇出现的频率来鉴别是否是垃圾邮件.系统输出+1判定为垃圾邮件,否则不是.这里答案是第二组. 拿二维数据来做例子.我们要选取一条线来划分红色的叉叉,和蓝色的圈圈样本点(线性划分).怎么做呢?这里的困难之处就在于,其实可行的解可能存在无数条直线可以划分这些样本点.很难全部求解,或许实际生活中并不需要全部求解.于是,

STL algorithm算法is_partitioned(26)

is_partitioned原型: std::is_partitioned template <class InputIterator, class UnaryPredicate> bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred); 测试范围内的元素是否是以pred为准则的一个划分.如果是,则返回true,否则返回false. 划分的意思是说,对每个元素进行pred(*it),得