POJ 1350 Cabric Number Problem (模拟)
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 (模拟)的更多相关文章
- poj 2104 K-th Number(主席树,详细有用)
poj 2104 K-th Number(主席树) 主席树就是持久化的线段树,添加的时候,每更新了一个节点的线段树都被保存下来了. 查询区间[L,R]操作的时候,只需要用第R棵树减去第L-1棵树就是区 ...
- POJ 1152 An Easy Problem! (取模运算性质)
题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...
- Buge's Fibonacci Number Problem
Buge's Fibonacci Number Problem Description snowingsea is having Buge’s discrete mathematics lesson, ...
- POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询)
POJ.3468 A Simple Problem with Integers(线段树 区间更新 区间查询) 题意分析 注意一下懒惰标记,数据部分和更新时的数字都要是long long ,别的没什么大 ...
- POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)
POJ 3468.A Simple Problem with Integers 这个题就是成段的增减以及区间查询求和操作. 代码: #include<iostream> #include& ...
- poj 3468 A Simple Problem with Integers 【线段树-成段更新】
题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...
- 线段树(成段更新) POJ 3468 A Simple Problem with Integers
题目传送门 /* 线段树-成段更新:裸题,成段增减,区间求和 注意:开long long:) */ #include <cstdio> #include <iostream> ...
- poj 2104 K-th Number 主席树+超级详细解释
poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...
- POJ 2826 An Easy Problem? 判断线段相交
POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...
随机推荐
- [Cnbeta]龙芯处理器性能怎么样
龙芯处理器性能怎么样?下一代CPU同频性能可达英特尔90% 在高性能处理器领域,英特尔是天花顶一般的存在(先不算地位特殊的IBM公司),国内发展CPU处理器的公司很多,绝大多数实力跟英特尔相比都差很远 ...
- WDS迁移注意事项
先说背景:公司使用WDS来部署操作系统,目前DHCP和WDS都安装在同一台服务器上,但是此服务器已过保,所以筹划迁移,将WDS和DHCP分别迁移到两台服务器上.迁移计划是保持WDS暂时不动,DHCP先 ...
- 红帽旗下Linux的版本说明RedHat、CentOS、Fedora、OEL等
简单总结一下RedHat.CentOS.Fedora Core区别关系: RedHat: 红帽已经被IBM 340亿刀收购了,但是红帽依旧发型自己的RedHat enterprise linux 版本 ...
- log4j2分析总结(一)
现在公司用log4j2 进行日志记录,我也看了相关的资料,现在进行记录学习总结下 整体结构 Appenders里设置日志的输出方式.级别和格式 Loggers里设置全局的级别和绑定appenders里 ...
- spring通过工厂模式解决页面耦合问题
spring通过工厂模式解决页面耦合问题
- Python语言算法的时间复杂度和空间复杂度
算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...
- BZOJ5323 JXOI2018游戏(线性筛+组合数学)
可以发现这个过程非常类似埃氏筛,将在该区间内没有约数的数定义为质数,那么也就是求每种方案中选完所有质数的最早时间之和. 于是先求出上述定义中的质数个数,线性筛即可.然后对每个最短时间求方案数,非常显然 ...
- HNOI2013旅行
一道欺负我智商的题... 本来想打单调队列优化dp的,结果看到算法标签就点了此题 洛谷题面 首先你要理解题意,蒟蒻理解了好久.它就是说,给你一个由1和-1组成的数列,让你分成m段,并让这m段区间和最大 ...
- Subsets II - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Subsets II - LeetCode 注意点 有重复的数字 数组可能是无序的,要先排序 解法 解法一:递归,只需要在Subsets中递归写法的基础上 ...
- 【BZOJ4872】【Shoi2017】分手是祝愿
Time Limit: 20 Sec Memory Limit: 512 MB Description Zeit und Raum trennen dich und mich. 时空将你我分开 ...