【2004】数学黑洞数6174

来源:互联网 发布:cntk caffe 编辑:程序博客网 时间:2024/05/11 17:42

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


 

 

0 0
原创粉丝点击