P1532 卡布列克圆舞曲
题目描述
卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:617461746174,这就是卡布列克常数,例如:
4321−1234=30874321-1234=30874321−1234=3087。
8730−378=83528730-378=83528730−378=8352。
8532−2358=61748532-2358=61748532−2358=6174。
7641−1467=61747641-1467=61747641−1467=6174。
如果 KKK 位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,称作卡布列克圆舞曲。例如对于五位数 543215432154321:
54321−12345=4197654321-12345=4197654321−12345=41976。
97641−14679=8296297641-14679=8296297641−14679=82962。
98622−22689=7593398622-22689=7593398622−22689=75933。
97533−33579=6395497533-33579=6395497533−33579=63954。
96543−34569=6197496543-34569=6197496543−34569=61974。
97641−14679=8296297641-14679=8296297641−14679=82962。
我们把 82962,75933,63954,6197482962,75933,63954,6197482962,75933,63954,61974 称作循环节,即卡布列克圆舞曲。
输入格式
若干行,每行为一个待求“卡布列克圆舞曲”的起始整数 nnn。(n<231n<2^{31}n<231)
输出格式
每行为对应整数的循环节,数据之间用空格隔开。
输入输出样例 #1
输入 #1
4321
54321
输出 #1
6174
82962 75933 63954 61974
C++实现
#include
#include
#include
using namespace std;
typedef long long LL;
int ind;
LL a[100000], n;
int main() {
while(cin >> n) {
ind = 0;
a[++ind] = n;
bool flag = true;
while(flag) {
LL b[20]={0}, n1 = 0, n2 = 0;
int in = 0;
while(n) { //拆分数
b[++in] = n % 10;
n /= 10;
}
sort(b+1, b+1+in); //排序
for(int i = 1; i <= in; i++) n1 = n110+b[i];
for(int i = in; i >= 1; i–) n2 = n210+b[i];
n = n2-n1;
for(int i = 1; flag && i <= ind; i++) //寻找
if(a[i] == n) {
flag = false;
for(int j = i; j <= ind; j++)
cout << a[j] << " “;
}
a[++ind] = n;
}
puts(”");
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P1532 卡布列克圆舞曲&spm=1001.2101.3001.5002&articleId=146518510&d=1&t=3&u=a436e431c4704f17bef5793fc1c2ac7d)
874

被折叠的 条评论
为什么被折叠?



