打卡信奥刷题(1027)用C++实现信奥 P1532 卡布列克圆舞曲

P1532 卡布列克圆舞曲

题目描述

卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:617461746174,这就是卡布列克常数,例如:

4321−1234=30874321-1234=308743211234=3087

8730−378=83528730-378=83528730378=8352

8532−2358=61748532-2358=617485322358=6174

7641−1467=61747641-1467=617476411467=6174

如果 KKK 位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,称作卡布列克圆舞曲。例如对于五位数 543215432154321

54321−12345=4197654321-12345=419765432112345=41976

97641−14679=8296297641-14679=829629764114679=82962

98622−22689=7593398622-22689=759339862222689=75933

97533−33579=6395497533-33579=639549753333579=63954

96543−34569=6197496543-34569=619749654334569=61974

97641−14679=8296297641-14679=829629764114679=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 = n2
10+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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值