1803 - 6174问题
时间限制 : 1 秒
内存限制 : 128 MB
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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
C语言解答
#include <stdio.h> int arrange(int *arr){ int i,j,t; for(i=0;i<4;i++){ for(j=0;j<3;j++){ if(arr[j]<arr[j+1]){ t=arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; } } } return 1; } int sepNum(int *d, int num){ d[0]=num%10; d[1]=num/10%10; d[2]=num/100%10; d[3]=num/1000; return 1; } int main(){ int i=0,num,newnum,n; int a,d[4]; scanf("%d",&n); while(n--){ scanf("%d",&num); sepNum(d,num); while(newnum!=6174){ arrange(d); newnum= d[0]*1000+d[1]*100+d[2]*10+d[3] - d[3]*1000-d[2]*100-d[1]*10-d[0]; sepNum(d,newnum); i++; } printf("%d\n",i+1); i=0; newnum=0; } return 1; }
Java解答
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); while(n-->0) { String str=sc.next(); String str1=getAnswer(str); int count=1; while(!str1.equals(str)) { count++; str=str1; str1=getAnswer(str1); } System.out.println(count); } } public static String getAnswer(String str) { char[] ch=str.toCharArray(); for(int i=0;i<ch.length;i++) { ch[i]=str.charAt(i); } maxbubbleSort(ch); String a=String.valueOf(ch); minbubbleSort(ch); String b=String.valueOf(ch); int c=Integer.parseInt(a)-Integer.parseInt(b); return String.valueOf(c); } public static void maxbubbleSort(char ch[]) { for(int i=0;i<ch.length;i++) { for(int j=0;j<ch.length-i-1;j++) { if(ch[j]<ch[j+1]) { char temp=ch[j]; ch[j]=ch[j+1]; ch[j+1]=temp; } } } } public static void minbubbleSort(char ch[]) { for(int i=0;i<ch.length;i++) { for(int j=0;j<ch.length-i-1;j++) { if(ch[j]>ch[j+1]) { char temp=ch[j]; ch[j]=ch[j+1]; ch[j+1]=temp; } } } } }