描述
卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。
例如:4321-1234=3087
8730-378=8352
8532-2358=6174
7641-1467=6174
如果K位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,称作卡布列克圆舞曲。例如对于五位数54321:
54321-12345=41976
97641-14679=82962
98622-22689=75933
97533-33579=63954
96543-34569=61974
97641-14679=82962
我们把82962 75933 63954 61974称作循环节,即卡布列克圆舞曲。
格式
输入格式
文件包含若干行,每行为一个待求“卡布列克圆舞曲”的起始整数(小于maxlongint)
输出格式
每行为对应整数的循环节,数据之间用空格隔开。
样例1
样例输入1
432154321
样例输出1
617482962 75933 63954 61974
限制
各个测试点1s
来源
Xiaomengxian
高一的第二次考试题
#include<iostream>
#include<string.h>
#include<cstring>
#include<cstdio>
using namespace std;
double number, circle[1000];
int check_print(int i)
{
int j;
for (j=0; j<i; j++)
{
if (circle[j]==circle[i])
{
break;
}
}
if (j==i) return 0;
else
{
for (; j<i; j++)
{
printf("%.0lf ", circle[j]);
}
printf("\n");
return 1;
}
}
double pow1(int n)
{
if (n==0) return 1;
else return pow1(n-1)*10;
}
double confuse(double number)
{
char ch[150];
int temp;
double max=0, min=0;
sprintf(ch, "%.0f", number);
int i,j;
for (i=0; i<strlen(ch); i++)
{
for (j=0; j<strlen(ch)-i-1; j++)
{
if (ch[j]>ch[j+1])
{
temp=ch[j];
ch[j]=ch[j+1];
ch[j+1]=temp;
}
}
}
for (i=0; i<strlen(ch); i++)
{
max+=pow1(i)*(ch[i]-'0');
min+=pow1(strlen(ch)-i-1)*(ch[i]-'0');
}
return max-min;
}
void femain(double number)
{
int i=0;
for (i=0;; i++)
{
circle[i]=number;
if (check_print(i)==1) break;
else
{
number=confuse(number);
}
}
}
int main()
{
while(1)
{
if (scanf("%lf", &number)==-1) break;
else
{
femain(number);
}
}
return 0;
}
如果觉得《卡布列克圆舞曲》对你有帮助,请点赞、收藏,并留下你的观点哦!