15-语言入门-15-6174问题

题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=57

描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数。
比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4。

输入
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数

输出
经过多少次上面描述的操作才能出现循环

样例输入
1
1234

样例输出
4

代码:

#include <stdio.h>

//计算num变成 数字从大到小的a,数字从小到大的b
//返回a-b
static int calCurrentValue(int num);

//插入排序-从后向前,最后一位最大
static int insertArray(int arr[],int len,int insertNum);

int main()
{
     int readLen = 0;
     scanf("%d",&readLen);
     getchar();
    
     while(readLen > 0)
     {
          int num = 0;
          scanf("%d",&num);
          getchar();
         
          int count = 0;
          int tmpNum = num;
          do
          {
               num = tmpNum;
               tmpNum = calCurrentValue(tmpNum);
               ++count;
          }while(tmpNum != num);
         
          printf("%d\n",count);
         
          --readLen;    
     }    
    
     return 0;
}

static int calCurrentValue(int num)
{
     int arr[4] = {0};
    
     int flag = num;
     while(flag > 0)
     {
          int tmpNum = flag % 10;
          insertArray(arr,4,tmpNum);
          flag = flag / 10;
     }
    
     int max = arr[3]*1000+arr[2]*100+arr[1]*10+arr[0];
     int min = arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
    
     return max - min;
}

static int insertArray(int arr[],int len,int insertNum)
{
     int index = len-1;
     for(;index>=0;--index)
     {
          if(arr[index] < insertNum)
               break;
     }
    
     if(index >= 0)
     {
          int j=0;
          for(;j<index;++j)
          {
               arr[j]=arr[j+1];
          }
         
          arr[index] = insertNum;
     }
}

本题考查内容:

1.如何分解整数的每一位。每次从最后一位分离的话,只需要每次 /10 即可。

2.排序的问题,要排序,就需要先将数据存储,本题确定了数据是4位数,所以使用了确定的数组,而

现实往往个数是不确定的。如果使用STL的库方法,确实更容易些,可以省去考虑个数变化和排序的问题,

直接关注如何解决问题本身,由此可见STL的巨大作用。

推荐的代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int main()
{
     //freopen("1.txt","r",stdin);
     int k;
     cin>>k;
     while(k--)
     {
          int n,a[4],n1,n2;
          scanf("%d",&n);
          int s=1;
          while(n!=6174)
          {
               a[0]=n%10;
               a[3]=n/1000;
               a[1]=n/10%10;
               a[2]=n/100%10;
               sort(a,a+4);
               n1=1000*a[3]+100*a[2]+10*a[1]+a[0];
               n2=1000*a[0]+100*a[1]+10*a[2]+a[3];
               n=n1-n2;
               s++;
          }
          printf("%d\n",s);
     }
}

时间: 2025-01-06 00:25:32

15-语言入门-15-6174问题的相关文章

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi

C语言入门(二十五)文件操作

文件操作  一.标准文件的读写 1.文件的打开fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char *f

R语言入门心得(3) -- 向量相关

向量定义 R在实际应用中比较常用的一个对象就是向量(Vector).向量的创建格式为 向量名 = c(x1,x2,x3,…..)  或  向量名 <- c(x1,x2,x3,…..) 或  c(x1,x2,x3,…..) -> 向量名 或  Assign("向量名", c(x1,x2,x3,…..)),c()为向量赋值函数,c()可以有任意多个参数,而起返回值则是一个把这些参数首尾相连形成的向量.你可以在命令行中输入?c或者help(c)来查看函数的详细信息.例如我们要创建

c语言入门经典(第5版)

文章转载:http://mrcaoyc.blog.163.com/blog/static/23939201520159135915734 文件大小:126MB 文件格式:PDF    [点击下载] C语言入门经典(第5版)  内容简介: C语言是每一位程序员都应该掌握的基础语言.C语言是微软.NET编程中使用的C#语言的基础:C语言是iPhone.iPad和其他苹果设备编程中使用的Objective-C语言的基础:C语言是在很多环境中(包括GNU项目)被广泛使用的C++语言的基础.C语言也是Li

第一节,C语言入门

1.标示符:    命名规则:    1.只能由字母.数字.下划线组成    2.不能数字开头    3.不能与关键字重名    4.严格区分大小写    命名规范:     1.起一个有意义名字     2.驼峰标示2.注释 注释: 对代码的解释说明,是写给程序看的,方面程序员之间交流 特点: 注释是不参与编译 /* 这里面可以写 */ 多行注释 // 这是一个单行注释 只有这一行是注释,只有 两个斜杠后面才是注释内容 /* */ command + / 注释或取消注释 多行注释是可以嵌套单行

哪有python开发语言入门教程免费下载?

人工智能时代,如果不想被机器人取代,最应该掌握的是编程.Python作为连续10年最受欢迎的编程语言,不但能开发Google .豆瓣等大型网站,还是人工智能领域的第一语言.那么,我猜你想问哪里有python开发语言入门教程. 千锋Python基础教程:http://pan.baidu.com/s/1qYTZiNE Python课程教学高手晋级视频总目录:http://pan.baidu.com/s/1hrXwY8k Python课程windows知识点:http://pan.baidu.com/

VC6.0学习C语言入门SDK

百度网盘链接 VC6.0    密码:t6bd VS2010 密码:3of2 C语言入门教程 在线视频地址(PS此链接摘抄至博主lellansin) Acfun.tv:http://www.acfun.tv/search.aspx#query=C语言入门教程 Bilibili.tv:http://www.bilibili.tv/search?keyword=C语言入门教程 最后和大家分享一个实现行列式算法的C代码 /*=======================================

《Go语言入门》第一个Go语言Web程序——简单的Web服务器

概述 上一篇讲了 <Go语言入门>第一个Go语言程序--HelloWorld,接下来讲一下Go语言Web开发入门必修课:第一个Go语言Web程序--简单的Web服务器. 与其它Web后端语言不同,Go语言需要自己编写Web服务器. 有关本地环境的搭建与基础学习,请参考: <Go语言入门>如何在Windows下安装Go语言编程环境 Go语言Web应用:IBM的云平台Bluemix使用初体验--创建Go语言 Web 应用程序,添加并使用语言翻译服务 Web服务器代码 Google在ht

简单易懂的程序语言入门小册子(9):环境,引入环境

\newcommand{\mt}[1]{\text{#1}} \newcommand{\mE}{\mathcal{E}} \newcommand{\tup}[1]{\left<{#1}\right>} 环境类似于其他语言(C++.JAVA等)的"符号表". 所谓符号表,是一张将变量名与变量代表的内容联系起来的一张表. 不过这里我们抛弃符号表的观点,单纯地从算法角度上引入环境这一概念. 引入环境 通过修改解释器求值过程的算法,可以很自然的引入环境这个概念. 在前面基于文本替换

简单易懂的程序语言入门小册子(6):基于文本替换的解释器,引入continuation

当我写到这里的时候,我自己都吃了一惊. 环境.存储这些比较让人耳熟的还没讲到,continuation先出来了. 维基百科里对continuation的翻译是"延续性". 这翻译看着总有些违和感而且那个条目也令人不忍直视. 总之continuation似乎没有好的中文翻译,仿佛中国的计算机科学里没有continuation这个概念似的. Continuation这个概念相当于过程式语言里的函数调用栈. 它是用于保存"现在没空处理,待会再处理的事"的数据结构. 这样说