题目链接

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. Git命令提交项目代码

    Git客户端安装 今天就结合`GitHub`,通过`Git`命令,来了解如何实现开源代码库以及版本控制 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托 ...

  2. springboot整合spring @Cache和Redis

    转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10779450.html spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: ...

  3. 使用简单zzupdate命令轻松升级Ubuntu到较新版本

    zzupdate是一个开源的命令行实用程序,通过将几个更新命令组合到一个命令中,使得将Ubuntu桌面版和服务器版升级到更新版本的任务变得容易一些. 将Ubuntu系统升级到更新的版本并不是一项艰巨的 ...

  4. STL Deque 容器

    STL Deque 容器 Deque简介 deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双 端的,而vector是单端的.         ...

  5. Climbing Stairs - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Climbing Stairs - LeetCode 注意点 注意边界条件 解法 解法一:这道题是一题非常经典的DP题(拥有非常明显的重叠子结构).爬到n ...

  6. 前端学习 -- Css

    Css:Cascading Style Sheets CSS叫做层叠样式表,用来设置页面中元素的样式.背景颜色.字体颜色.字体大小... 编写位置: 1,内联样式: 将样式编写到标签的style属性中 ...

  7. Composer 更换为国内镜像源(Packagist 镜像)

    安装lavavel步骤: 安装composer (需要开启php_openssl扩展,否则报错) (https://getcomposer.org/) 到github下载laravel的最新发行版 ( ...

  8. jquery的serializeArray、param 与serializeArray 的区别与源码解析

    jQuery.param( obj, traditional ) 为url查询或者ajax 将对象或者数组转为url参数或ajax参数,是挂在jQuery对象上的静态方法,有码有真相: var myI ...

  9. 解题:NOI 2016 优秀的拆分

    题面 其实题目不算很难,但是我调试的时候被玄学了,for循环里不写空格会RE,写了才能过.神**调了一个多小时是这么个不知道是什么的玩意(真事,可以问i207M=.=),心态爆炸 发现我们只要找AA或 ...

  10. VS生成事件执行XCOPY时出现Invalid num of parameters的解决方案

    最近想偷懒 想把项目生成的dll全部自动汇集到一个文件夹下 于是乎就动用了VS的生成后事件 在执行Xcopy的时候碰到了点问题 Invalid number of parameters 挺奇怪的,在公 ...