【C++】1876 - 数字黑洞

问题

任意一个四位正整数( 4 位数字相同者除外), 将各位数字组成一个最大数和最小数,两数相减并重复这一过程必得6174 。

在这里插入图片描述

1.分析问题

  1. 已知:四位正整数
  2. 未知:得到6174的过程
  3. 关系:各位数字组成一个最大数和最小数,两数相减

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;	
}

猜你喜欢

转载自blog.csdn.net/qq_39180358/article/details/135216074
今日推荐