题目链接

Description

If we input a number formed by 4 digits and these digits are not all of one same value, then it obeys the following law. Let us operate the number in the following way:

(1) Arrange the digits in the way from bigger to smaller, such that it forms the biggest number that could be made from these 4 digits;

(2) Arrange the digits in the way from smaller to bigger, such that it forms the smallest number that could be made from these 4 digits (If there is 0 among these 4 digits, the number obtained may be less than four digits);

(3) Find the difference of these two numbers that is a new four digital number.

Repeat the above process, we can finally always get the result 6174 or 0.

Please write the program to realize the above algorithm.

Input

Each case is a line of an integer.-1 denotes the end of input.

Output

If the integer is formed exactly by 4 digits and these digits are not all of one same value, then output from the program should show the procedure for finding this number and the number of repetition times. Otherwise output "No!!".

Sample Input

5364

2221

4444

-1

Sample Output

N=5364:

6543-3456=3087

8730-378=8352

8532-2358=6174

Ok!! 3 times

N=2221:

2221-1222=999

999-999=0

Ok!! 2 times

N=4444:

No!!

分析:

题目会给定一个四位数字,将每个数位上的数字重新排列组合后,能够组成一个最大的四位数和最小的四位数。将求差之后的结果接着进行计算,直到答案为6174或则为0.

注意:最开始输进去的一个是四位数,切四个位数不能够全部相等。

中间计算后的结果可能不是四位数字,所以如果按照四位数字计算的话,得去掉所有的前导0.

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int cant(int s)//判断四个位置上的数字是否完全相同
{
int a=s/1000;
int b=s/100%10;
int c=s/10%10;
int d=s%10;
if(a==b&&b==c&&c==d) return 1;
return 0;
}
int cal(int s)//s传进来的是每次计算后得到的结果
{
int a[4];
a[0]=s/1000;
a[1]=s/100%10;
a[2]=s/10%10;
a[3]=s%10;
int fl=0;//表示的是这个计算结果中前导0的个数
if(a[0]==0)
{
fl=1;
if(a[1]==0)
{
fl=2;
if(a[2]=0)fl=3;
}
}
sort(a,a+4);//从小到大排序
int max_num,min_num;
min_num=a[0]*1000+a[1]*100+a[2]*10+a[3];
// 处理高位为0的情况
if(fl==0)
{
max_num=a[3]*1000+a[2]*100+a[1]*10+a[0];
}
else if(fl==1)
{
max_num=a[3]*100+a[2]*10+a[1];
}
else if(fl==2)
{
max_num=a[3]*10+a[2];
}
else
{
max_num=a[3];
}
printf("%d-%d=%d\n",max_num,min_num,max_num-min_num);
return max_num-min_num;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1)
{
printf("N=%d:\n",n);
if(n>=9999||n<=1000||cant(n)) //注意,输入一定要是4位数,并且四个位置上的数字不能全部相同
{
printf("No!!\n");
continue;
}
int ans=0;
while(n!=0&&n!=6174)
{
ans++;
n=cal(n);
}
printf("Ok!! %d times\n",ans);
}
return 0;
}

POJ 1350 Cabric Number Problem (模拟)的更多相关文章

  1. poj 2104 K-th Number(主席树,详细有用)

    poj 2104 K-th Number(主席树) 主席树就是持久化的线段树,添加的时候,每更新了一个节点的线段树都被保存下来了. 查询区间[L,R]操作的时候,只需要用第R棵树减去第L-1棵树就是区 ...

  2. POJ 1152 An Easy Problem! (取模运算性质)

    题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...

  3. Buge's Fibonacci Number Problem

    Buge's Fibonacci Number Problem Description snowingsea is having Buge’s discrete mathematics lesson, ...

  4. POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)

    POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...

  5. POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)

    POJ 3468.A Simple Problem with Integers 这个题就是成段的增减以及区间查询求和操作. 代码: #include<iostream> #include& ...

  6. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  7. 线段树(成段更新) POJ 3468 A Simple Problem with Integers

    题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...

  8. poj 2104 K-th Number 主席树+超级详细解释

    poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...

  9. POJ 2826 An Easy Problem? 判断线段相交

    POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...

随机推荐

  1. macOS how to install python3

    macOS how to install python3 macOS & Python 3.7.2 https://www.python.org/downloads/mac-osx/ http ...

  2. linux 关机、重启

    一.重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20 ...

  3. BZOJ3240 NOI2013矩阵游戏(数论)

    必修五题. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cmath> ...

  4. SpringBoot项目部署进阶

    一.war包部署 通过“云开发”平台初始化的SpringBoot项目默认采用jar形式打包,这也是我们推荐的方式.但是,因为某些原因,软件需求方特别要求用war形式打包,我们该怎么做? 1.项目尚未开 ...

  5. 【BZOJ2731】三角形覆盖问题

    想象一条平行于\(y\)轴的扫描线,从低往高扫描.如何确定关键高度才能使每两个关键高度之间分割出的图形易于计算呢? 关键高度有:三角形底边高度.三角形上顶点高度.三角形交点的高度. ​ 如此分割,我们 ...

  6. RRDtool绘制lvs连接数图形

    需求:用RRDtool绘制lvs的连接数图形 RRDtool是一个强大的绘图工具,作者是Tobias Oetiker. RRD全称Round Robin Database,轮转数据库,也是一个时间序列 ...

  7. java的序列化流和打印流

    对象操作流(序列化流) 每次读取和写出的都是JavaBean对象. 序列化:将对象写入到文件中的过程 反序列化:从文件中读取对象到程序的过程 transient: 标识瞬态,序列化的时候,该修饰符修饰 ...

  8. java多线程 -- 线程八锁

    一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些 ...

  9. 封装个StringBuffer,用array join的方式拼接字符串

    (function(window) { var core_ArrPro = Array.prototype; var core_slice = core_ArrPro.slice; var core_ ...

  10. mysql 5.7 json 字段类型查找、修改

    修改 json 里的数组字段 mysql> set @json = '{"test": [{"name": "laravel"}, { ...