2017 山东 NOIP 小学组复赛试题3——6174 问题

本文介绍了6174问题,即对一个四位数按位排序后进行相减操作,直到出现循环。文章提供了一个四位数的例子,详细说明了操作过程,并给出输入输出格式和数据范围。内容包括题目解析和解决问题的代码实现。
摘要由CSDN通过智能技术生成

6174 问题

【问题描述】

假设你有一个各位数字不完全相同的四位数,把所有的数字从大到小排序后得到 a,从小到大排序后得到 b,然后用 a-b 替换原来这个数,并且继续操作。
例如,从 1234 出发,依次可以得到 4321-1234=3087、8730-378=8352、8532-2358=6174、7641-1467=6174,又回到了它自己!现在请你写一个程序来判断一个四位数经过多少次这样的操作能出现循环。
比如输入 1234 执行顺序是 1234->3087->8352->6174->6174,输出结果是 4。

【输入】

输入文件名为 kaprekar.in。
输入文件第一行是一个正整数 n,表示有 n 组测试数据,
接下来的 n 行,每行一个各位数字不完全相同的四位数。

【输出】

输出文件名为 kaprekar.out。
对于每组测试数据输出一行,每行中只有一个整数,表示经过多少次操作
才出现循环。

【输入输出样例】

kaprekar.inkaprekar.out
1
1234
4

【数据范围】

对于 50%的数据:0<n<=100;
对于 100%的数据:0<n<=10000。

题目解析

由题目中已知,我们需要输入的n个数据均为四位数,需要把这个四位数进行从大到小排序,得到较大的数a,再进行从小到大排序,得到较小的数b。不断重复上述操作,直至所得的数出现循环,即出现上一次的他自己,这里可以用到while循环。

代码如下

#include<bits/stdc++.h>
using namespace std;
int a[6];
//solve()函数完成分离位数、排序、数字重组,以及求差值的工作
int solve(int x){
	memset(a,0,sizeof(a));
	int s1=0,s2=0,i=0;
	a[1]=x%10;
    a[2]=x/10%10;
    a[3]=x/100%10;
    a[4]=x/1000%10;
	sort(a+1,a+5);
	s1=a[1]*1000+a[2]*100+a[3]*10+a[4];
	s2=a[4]*1000+a[3]*100+a[2]*10+a[1];
	return s2-s1;	
}
int main(){	
	int n,x;
	scanf("%d",&n);
	while(n--){
		scanf("%d",&x);
		int s=0,x1=0,y=0;
		//判断是否出现重复的两个数
		while(x!=y){
			y=x;
			s++;
			x=solve(x);//调用函数
		}	
		printf("%d\n",s);	
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小芒果_01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值