题目描述
小明喜欢玩数字变换,也就是把数字的第一个数位放到最后变成一个新的数字。他得到一个数字,想知道通过不断的进行数字串变换,一共可以得到哪些不同的数字。
输入
一个整数 n。
输出
第一行为一个整数,表示一共可以得到多少个不同的数字;
第二行为一组整数,为得到的每一个不同的数字,从小到大排列。
样例输入输出
样例输入 #1
9981752
样例输出 #1
7
1752998 2998175 5299817 7529981 8175299 9817529 9981752
数据范围
1<=n<=10^18。
题解:
方法一:
用字符串位移的程序并用一个字符串存储并用sort和unique函数直接进行排序和去重的工作,最后根据原去重后的字符串数组进行输出,然后只得了40分。。。。。。
40分的代码:
#include<bits/stdc++.h>
using namespace std;
string s,z[20];
char c;
int main(){
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
c=s[0];
for(int j=1;j<len;j++)
s[j-1]=s[j];
s[len-1]=c;
z[i]=s;
}
sort(z,z+len);
len=unique(z,z+len)-z;
cout<<len<<endl;
for(int i=0;i<len;i++)
cout<<z[i]<<" ";
return 0;
}
方法二:
连着测试了几个样例后我发现原来如果字符串位移后开头如果是零是要去掉的,因为题目的本意就是按照数字的规则来转换,所以我调用了stringstream来把字符串转为数字,然后就这样AC了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
string s,z[20];
long long a[20];
char c;
int main(){
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
c=s[0];
for(int j=1;j<len;j++)
s[j-1]=s[j];
s[len-1]=c;
stringstream geek(s);
geek>>a[i];
}
sort(a,a+len);
len=unique(a,a+len)-a;
cout<<len<<endl;
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
return 0;
}