[数字逻辑模拟]7-3 卡布列克常数(2010慈溪) (20分)
最近,小博在数学兴趣课中了解了“卡布列克常数”。卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个最大的数和一个最小的数,然后用最大数减去最小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。 例如:4321-1234=3087 8730-378=8352 8532-2358=6174 7641-1467=6174 …… 小博想,我能不能编程来验证呢?输入一个符合条件的四位数,然后验证运算过程。
输入格式:
共1行,为任意一个不是用完全相同数字组成的四位数。
输出格式:
变为卡布列克常数的运算过程,由若干行组成,每行是一个算式,不含空格。
输入样例:
4321
输出样例:
4321-1234=3087 8730-378=8352 8532-2358=6174
思路:按题目意思来即可,没啥规律
注意min的值可能为三位数的情况
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 string s; 8 int min = 0, max = 0, tmp = 0; 9 cin >> s; 10 while (max - min != 6174) 11 { 12 sort(s.begin(), s.end()); 13 if (s[0] == 0) 14 { 15 min = (s[1] - '0') * 100 + (s[2] - '0') * 10 + s[3] - '0'; 16 } 17 else 18 { 19 min = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + s[3] - '0'; 20 } 21 max = (s[3] - '0') * 1000 + (s[2] - '0') * 100 + (s[1] - '0') * 10 + s[0] - '0'; 22 tmp = max - min; 23 printf("%d-%d=%d\n", max, min, tmp); 24 s=to_string(tmp); 25 } 26 }