描述
卡布列克是一位數學家,他在研究數字時發現:任意一個不是用完全相同數字組成的四位數,如果對它們的每位數字重新排序,組成一個較大的數和一個較小的數,然後用較大數減去較小數,差不夠四位數時補零,類推下去,最後將變成一個固定的數: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
4321
54321
樣例輸出1
6174
82962 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;
}