糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > VIJOS-卡布列克圆舞曲(模拟)-c++

VIJOS-卡布列克圆舞曲(模拟)-c++

时间:2021-02-04 15:43:20

相关推荐

VIJOS-卡布列克圆舞曲(模拟)-c++

【问题描述】

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

4321-1234=3087

8730-378=8352

8532-2358=6174

7641-1467=6147

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

54321-12345=41976

97641-14679=82962--+

98622-22689=75933|

97533-33579=63954|

96543-34569=61974|

97641-14679=82962--+

我们把82962 75933 63954 61974称作循环节,即卡布列克圆舞曲。

【输入格式】

包含若干行,每行为一个待求“卡布列克圆舞曲”的起始整数N。

【输出格式】

每行为对应整数的循环节,数据之间用空格隔开。

【输入样例】

4321

54321

【输出样例】

6174

82962 75933 63954 61974

【数据范围】

1 < N <= 2147483647。

【问题分析】

模拟过程:

①输入1个k位数→②组成max&min两个数→③cha=max-min→④搜索之前的x是否有与此相同的,如有,输出上一个相同的cha此个cha的前一个;如没有,则继续循环,直到出现相同为止→⑥分析下一个k位数

【关键步骤&技巧】

1. 虽然大体步骤不多,然而中间小过程的处理还是有点繁琐,若哪手抖打错,debug还是有点累的啦,因此某些步骤还是写作自定义函数封装起来,for 程序的可读性,also for DEBUGGING

2. 数据的第一遍读入时应先得到它的位数,再进行排序组成max&min,毕竟后面的cha的位数必须和原数相同(不同则补0)

所以

3. max&min的组成技巧:将各个数位的数拆散排序存入a[ ]后,for循环t-1次(t为位数),定义一个s=max(or min)最大位数的那个数,循环内容:s=s*10+a[i]

优点:保证max、min、cha都是k位数

4. 记得每次求得的cha应保存在cha[ ]中;

关键代码:

int a[15]while(scanf("%lld",&n)==1){int t=bit(n);//求得位数long long cha[100],max,min;cha[0]=n;for(int k=1;;k++){input(a,cha[k-1]); //分解每一个cha(cha下标从1开始,因此将n放于0,以便首次是拆n)for(int i=1;i<t;i++)//排序 {int flag=0;for(int j=1;j<=t-i;j++)if(a[j]>a[j+1]){swap(a[j],a[j+1]);flag=1;} if(flag==0)break; } max=maxn(t);min=minn(t);cha[k]=max-min;int flag=0;//记录下标for(int i=1;i<k;i++)if(cha[k]==cha[i]) {flag=i;break;}if(flag!=0){for(int i=flag;i<k;i++)printf("%lld ",cha[i]);printf("\n");break;//记得及时跳出!}}}

如果觉得《VIJOS-卡布列克圆舞曲(模拟)-c++》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。