问题
任意一个四位正整数( 4 位数字相同者除外), 将各位数字组成一个最大数和最小数,两数相减并重复这一过程必得6174 。
1.分析问题
- 已知:四位正整数
- 未知:得到6174的过程
- 关系:各位数字组成一个最大数和最小数,两数相减
2.定义变量
//二、数据定义
int n;
3.输入数据
//三、数据输入
cin>>n;
4.数据计算
因为需要重新组装数,所以肯定用到拆位,首选短除法。
temp:实际上是n的值,用于短除法迭代循环。
a[4]:这里使用一个数组来储存拆位得到的数。
c:记录数组下标。
int temp=n,max,min,result,c=0,a[4]={
0};
while(temp>0){
a[c]=temp%10;
++c;
temp/=10;
}
需要组成一个最大数max和最小数min,那么我想到的办法是将数组排序,那么最大数和最小数就都知道了。
for(int i=0;i<3;i++){
for(int j=0;j<3-i;j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
max=a[3]*1000+a[2]*100+a[1]*10+a[0];
min=a[0]*1000+a[1]*100+a[2]*10+a[3];
两数相减result,并输出。
result=max-min;
cout<<max<<"-"<<min<<"="<<result<<endl;
重复这个过程,直到这个数=6174。
//四、数据计算
while(6174!=n){
n=result;
}
5.输出结果
完整代码。
#include<iostream>
using namespace std;
int main(){
//一、分析问题
//已知:四位正整数
//未知:得到6174的过程
//关系:各位数字组成一个最大数和最小数,两数相减
//二、数据定义
int n;
//三、数据输入
cin>>n;
//四、数据计算
while(6174!=n){
int temp=n,max,min,result,c=0,a[4]={
0};
while(temp>0){
a[c]=temp%10;
++c;
temp/=10;
}
for(int i=0;i<3;i++){
for(int j=0;j<3-i;j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
max=a[3]*1000+a[2]*100+a[1]*10+a[0];
min=a[0]*1000+a[1]*100+a[2]*10+a[3];
result=max-min;
cout<<max<<"-"<<min<<"="<<result<<endl;
n=result;
}
//五、输出结果
return 0;
}