vijos p1024 卡布列克圆舞曲

描述 Description  
  卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数: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称作循环节,即卡布列克圆舞曲。
     
     
  输入格式 Input Format  
  文件包含若干行,每行为一个待求“卡布列克圆舞曲”的起始整数(小于maxlongint)
     
     
  输出格式 Output Format  
  每行为对应整数的循环节,数据之间用空格隔开。
     
     
  样例输入 Sample Input  
  4321 54321
     
     
  样例输出 Sample Output  
  6174 82962 75933 63954 61974
     
     
  时间限制 Time Limitation  
  各个测试点1s

这个JUDGE好蛋疼啊,用lld%不行,搞得我为这个题WA了好几次。

#include<iostream>
#include<algorithm>
#include<set>
#include<cstdio>
#include<cmath>
#include<vector>

using namespace std;


void getvalue(long long num,long long len,long long& max,long long& min)
{
	int tmp[30];
	max=0,min=0;
	for(int i=0;i<len;i++)
	{
		tmp[i]=num%10;
		num/=10;
	}
	sort(tmp,tmp+len);
	for(int i=len-1;i>-1;i--)max=max*10+tmp[i];
	for(int i=0;i<len;i++)min=min*10+tmp[i];
}


int main()
{
	long long  num,max,min;
	set<long long>st;
	vector<long long>ans;
	ans.reserve(1024);
	while(cin>>num)
	{
		int len=log10(num)+1;
		ans.clear();
		st.clear();
		while(st.count(num)==0)
		{
			st.insert(num);
			ans.push_back(num);
			getvalue(num,len,max,min);
			num=max-min;
			while(log10(num)+1<len)num*=10;
		}
		for(vector<long long >::iterator iter=find(ans.begin(),ans.end(),num);iter!=ans.end();iter++)
		{
			cout<<*iter;
			if(iter!=ans.end()-1)printf(" ");
		}
		puts("");
	}
	return 0;
}


你可能感兴趣的:(vijos p1024 卡布列克圆舞曲)