程序基本算法习题解析 任意给一个四位数(各位数不完全相同), 各位上的数可组成一个最大数和一个最小数, 它们的差又能组成一个最大数和一个最小数, 直到某一步得到的差将会出现循环重复。

这是《程序基本算法习题解析》中的一道练习题。

题目:

       任意给一个四位数(各位数不完全相同), 各位上的数可组成一个最大数和一个最小数, 它们的差又能组成一个最大数和一个最小数, 直到某一步得到的差将会出现循环重复。写一个程序统计所有满足以上条件的四位数。

// Chapter1_6.cpp : Defines the entry point for the application.
// 任意给一个四位数(各位数不完全相同),
//各位上的数可组成一个最大数和一个最小数,
//它们的差又能组成一个最大数和一个最小数,
//直到某一步得到的差将会出现循环重复。
//写一个程序统计所有满足以上条件的四位数。

#include "stdafx.h"
#include<iostream>
using namespace std;

int main()
{
	int num;
	cout << "please input a number: ";
	cin >> num;
	int cha = num,temp,qian,bai,shi,ge,max,min;
	//当差不等于6174时,6174是书上给的提示
	while(cha != 6174)
	{
		//将输入的四位数分解成四个数字
		qian = num / 1000;
		bai = (num - qian*1000) / 100;
		shi = (num - qian*1000 - bai*100) / 10;
		ge = num - qian*1000 - bai*100 - shi*10;
		//以下三个if是为了将最大值换到qian上
		if(qian < bai)
		{
			temp = qian;
			qian = bai;
			bai = temp;
		}
		if(qian < shi)
		{
			temp = qian;
			qian = shi;
			shi = temp;
		}
		if(qian < ge)
		{
			temp = qian;
			qian = ge;
			ge = temp;
		}
		//以下两个if是将第二大值换到bai上
		if(bai < shi)
		{
			temp = bai;
			bai = shi;
			shi = temp;
		}
		if(bai < ge)
		{
			temp = bai;
			bai = ge;
			ge = temp;
		}
		//以下if是将第三大值换到shi上
		if(shi < ge)
		{
			temp = shi;
			shi = ge;
			ge = temp;
		}
		//求四个数字组成的最大值和最小值
		max = qian*1000+bai*100+shi*10+ge;
		min =  ge*1000+shi*100+bai*10+qian;
		//求最大值和最小值之差
		cha = max - min;
		//将差赋给num,重复以上计算过程
		num = cha;
		cout << max << " - " << min << " = " << cha << endl;
	}
	system("pause");
	return 0;
}

运行结果如下:

        书上是用c语言实现的,这里用了c++,但是具体思路是一致的。不过我认为题目描述得不好,它要求统计所有满足以上条件的四位数,看起来像是应该是写一个for循环,遍历所有四位数,检验其是否满足条件。但其实任意输入一个四位数,最终都会得到6174这一结果,例如:

因此,出题人可能是希望能够写出计算过程。

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/85001478