这是《程序基本算法习题解析》中的一道练习题。
题目:
任意给一个四位数(各位数不完全相同), 各位上的数可组成一个最大数和一个最小数, 它们的差又能组成一个最大数和一个最小数, 直到某一步得到的差将会出现循环重复。写一个程序统计所有满足以上条件的四位数。
// 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这一结果,例如:
因此,出题人可能是希望能够写出计算过程。