PAT乙级真题之数字黑洞(数位字符排序、数组函数)

题目描述
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
 一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

 例如,我们从6767开始,将得到

 7766 - 6677 = 1089
 9810 - 0189 = 9621
 9621 - 1269 = 8352
 8532 - 2358 = 6174
 7641 - 1467 = 6174
 ... ...

 现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入描述:
输入给出一个(0, 10000)区间内的正整数N。

输出描述:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
 式输出。

输入例子:
6767

输出例子:
7766 - 6677 = 1089
 9810 - 0189 = 9621
 9621 - 1269 = 8352
 8532 - 2358 = 6174

  

package abc;

import java.util.Arrays;
import java.util.Scanner;

public class Main{
	public static void main(String [] args) {
	     Scanner input = new Scanner(System.in);

	     String n = input.next();
	     if(K(n)[2]==0) {
	    	 System.out.println(n+" - "+n+" = "+"0000");
	     }else {
	    	 while(K(n)[2]!=6174) {
	    		 System.out.printf("%04d - %04d = %04d\n",K(n)[0],K(n)[1],K(n)[2]);                           ///%04d 表示:在输出整数x的时候 按照4个位子的空间左对齐 多余的位子用0代替
	    		 n=K(n)[2]+"";
	    	 }
	    	 System.out.printf("%04d - %4d = %04d\n",K(n)[0],K(n)[1],K(n)[2]);
	     }
	     input.close();

	}

	public static int[] K(String n) {
		while(n.length()<4) {
			n="0"+n;
		}
		int[] L = new int[4];///定义整型数组
		for(int i=0;i<4;i++) L[i]=n.charAt(i)-‘0‘;
		Arrays.sort(L);///降序
		int n1 = L[3]*1000+L[2]*100+L[1]*10+L[0];
		int n2 = L[0]*1000+L[1]*100+L[2]*10+L[3];
		int [] k= {n1,n2,n1-n2};
		return k;
	}
}

  

原文地址:https://www.cnblogs.com/zws-bugging/p/12293431.html

时间: 2024-11-09 00:56:26

PAT乙级真题之数字黑洞(数位字符排序、数组函数)的相关文章

PAT 乙级真题 1002.数字分类

PAT 乙级真题 1002.数字分类 题目描述 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...: A3 = 被5除后余2的数字的个数: A4 = 被5除后余3的数字的平均数,精确到小数点后1位: A5 = 被5除后余4的数字中最大数字. 输入格式 每个输入包含1个测试用例.每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的

1054. 求平均值 (20)-PAT乙级真题

今天刚刚到学校,2017年学习正式开始了,今天看到了浙大的<数据结构>这学期又要开课了,决定一定要跟着学习一遍:在大学生mooc网上学习:http://www.icourse163.org/course/zju-93001#/info :然后就是跟着<算法之美>也要同步看完. 然后就在PAT上随便做一道题,这是第一次通过AC,发现了两个比较好的博客主页:http://www.liuchuo.net/  和  https://www.joyhwong.com/   都总结了刷题的过程

PAT 乙级真题 1008.锤子剪刀布

PAT 乙级真题 1008.锤子剪刀布 题目描述 大家应该都会玩"锤子剪刀布"的游戏: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式 输入第1行给出正整数N(<=105),即双方交锋的次数.随后N行,每行给出一次交锋的信息,即甲.乙双方同时给出的的手势.C代表"锤子".J代表"剪刀".B代 表"布",第1个字母代表甲方,第2个代表乙方,中间有1个空格. 输出格式 输出

PAT 乙级真题 1013.组个最小数

PAT 乙级真题 1013.组个最小数 题目描述 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如: 给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558. 现给定数字,请编写程序输出能够组成的最小的数. 输入格式 每个输入包含1个测试用例.每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0.数字1.--数字9的个数.整数间用一个空 格分隔.10个数字的总个数不超过50,且至少拥有1个

PAT 乙级真题 1011.个位数统计

PAT 乙级真题 1011.个位数统计 题目描述 给定一个k位整数N = dk-110k-1 + ... + d1101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字出现的次数.例如:给定N = 100311,则有2个0,3个1,和1个3. 输入格式 每个输入包含1个测试用例,即一个不超过1000位的正整数N. 输出格式 对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M.要求按D的升序输出

PAT 乙级真题 1006.1016.部分A+B

PAT 乙级真题 1006.1016.部分A+B 题目描述 正整数A的"DA(为1位整数)部分"定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的"6部分"PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编写程序计算PA + PB. 输入格式 输入在一行中依次给出A.DA.B.DB,中间以空格分隔,其中0 < A, B < 1010. 输出格式 在一行中输出PA + PB的值. 输入样例 386276

PAT 乙级真题 1012.D进制的A+B

PAT 乙级真题 1012.D进制的A+B 题目描述 输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. 输入格式 输入在一行中依次给出3个整数A.B和D. 输出格式 输出A+B的D进制数. 输入样例 123 456 8 输出样例 1103 题目思路 #include<bits/stdc++.h> #define ll long long int using namespace std; int main() { ll a,b

PAT乙级真题1016.部分A+B(15)(2016-4-28)

原题: 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编写程序计算PA + PB. 输入格式: 输入在一行中依次给出A.DA.B.DB,中间以空格分隔,其中0 < A, B < 1010. 输出格式: 在一行中输出PA + PB的值. 输入样例1:3862767 6

PAT乙级真题1004. 成绩排名 (20)(解题)

题目: 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的. 输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是