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

浙公网安备 33010602011771号