zl程序教程

您现在的位置是:首页 >  其它

当前栏目

【2004】数学黑洞数6174

数学 黑洞
2023-09-14 09:03:46 时间

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