小明OJ——数字变换

题目描述

小明喜欢玩数字变换,也就是把数字的第一个数位放到最后变成一个新的数字。他得到一个数字,想知道通过不断的进行数字串变换,一共可以得到哪些不同的数字。

输入

一个整数 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值