• 【2004】数学黑洞数6174


    Time Limit: 3 second
    Memory Limit: 2 MB

    已知一个任意的不完全重复的四位正整数,将其数字重新组合成一个最大的数和一个最小的数并使之相减,这称为“重排求差”。其结果不足四位时,右边补0,组成大的四位数;左边补0,组成小的四位数。重复这个过程,最多七步,必能得到6174。求某一四位数(每位数字完全相同的除外)经上述“重排求差”步骤均能得到6174的步数。当输入的四位正整数是四位完全重复时,输出“error”字样

    例如:输入任一四位数:1234
    输出变换的步数:3

    Input

    输入所要变换的四位数
    第一行输入所要变换的四位数的值

    Output

    输出变换的步数

    Sample Input

    1234
    

    Sample Output

    3
    

    【题解】

    输入的数字可以转化成字符串来处理。

    先将这个数字排序,怎样排都可以,正着是最大 那反过来就是最小,不用排两次。

    相减,然后再按照要求添0。之后就又是同样的工作,排序。。

    【代码】

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <cstdio>
    
    using namespace std;
    
    const string goal = "6174";
    
    string str;
    
    int step=0;
    
    void input_data()
    {
    	//freopen("E:\rush.txt","r",stdin);
    	cin >> str; //输入字符串 
    	//int t2 = atoi(str.c_str()); //这个atoi函数很慢。不要用		 
    }
    
    void special_judge() //特判一下 数字全都相同的情况 
    {
    	bool flag = true;
    	for (int i = 0;i<=2;i++) //有前后两个数字不同就是充分条件 
    		if (str[i]!=str[i+1])	
    			flag=false;
    	if (flag) 
    		{
    			cout << "error";
    			exit(0);	//exit(0) ->stdlib.h 
    		}
    }
    
    void trytoget_ans()
    {
    	while (str!=goal) //如果现在算的没有达到目标 
    		{
    			step++;//增加步数 
    			bool flag = false; //进行冒泡排序 
    			while (!flag)
    				{
    					flag = true;
    					for ( int i = 0;i<=2;i++)
    						if (str[i]>str[i+1])
    							{
    								char temp = str[i];
    								str[i] = str[i+1];
    								str[i+1] = temp;	
    								flag = false;
    							}
    				}
    			string maxs; 
    			for (int i = 0;i<=3;i++) maxs[i]=str[3-i];//倒过来是最大值 
    			int maxi = (maxs[0]-'0')*1000 + (maxs[1]-'0')*100+(maxs[2]-'0')*10+(maxs[3]-'0');
    			int mini = (str[0]-'0')*1000 + (str[1]-'0')*100 + (str[2]-'0')*10 + (str[3]-'0');
    			//上面两行将字符串转化为整形 
    			int temp2 = maxi - mini;//相减 
    			string temp3 = ""; //接下来把整形转化为字符串。函数不靠谱的 别用 
    			int str_n = 0;
    			while (temp2!=0)
    				{
    						int t1 = temp2 % 10;
    						char t2 = t1 + '0';
    						temp3 = t2 + temp3;
    						temp2 /= 10;
    						str_n +=1; //一边判断一下数字的位数 
    				}
    			str = temp3; 
    			if (str_n == 1) str+="000"; //根据位数 补零 接下来就是同样的工作了 
    			if (str_n == 2) str+="00";
    			if (str_n == 3) str+="0";
    		}
    }
    
    void output_ans()
    {
    	cout << step;	
    }
    
    int main()
    {
    	input_data();
    	special_judge();
    	trytoget_ans();
    	output_ans();
    	return 0;	
    }
    


  • 相关阅读:
    服务器建设问题
    JDBC --反射(二)
    Cookies
    http和https区别
    springboot常用注解
    线程池
    悲观锁和乐观锁
    java高并发下的数据安全
    idea解决mybatis逆向工程
    spring Cloud
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632509.html
Copyright © 2020-2023  润新知