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