算法提高 阮小二买彩票
2017-01-08 10:32
183 查看
问题描述
在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多。可是一段时间观察下来,阮小二发现自己账户的钱增长好慢啊,碰到节假日的时候连个铜板都没进,更郁闷的是这些天分文不进就算了,可恨的是银行这几天还有可能“落井下石”(代扣个人所得税),看着自己账户的钱被负增长了,阮小二就有被割肉的感觉(太痛苦了!),这时阮小二最大的愿望无疑是以最快的速度日进斗金,可什么方法能够日进斗金呢?抢银行(老本行)?不行,太危险,怕有命抢没命花;维持现状?受不了,搂钱太慢了!想来想去,抓破脑袋之后,终于想到了能快速发家致富的法宝----买彩票,不但挣了钱有命花,运气好的话,可以每天中他个几百万的,岂不爽哉!抱着这种想法,阮小二开始了他的买彩票之旅。想法是“好的”(太天真了OR
太蠢了),可是又发现自己的数学功底太差,因为不知道数字都有哪些组合排列?那现在就请同学们写个递归程序,帮助阮小二解决一下这个问题吧!
输入格式
不超过6位数的正整数N,注意:构成正整数N的数字可重复
输出格式
组成正整数N的所有位数的全排列,这些排列按升序输出,每个排列占一行。
注意:输出数据中不能有重复的排列
样例输入
123
样例输出
123
132
213
231
312
321
样例输入
3121
样例输出
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
样例输入
4003
样例输出
0034
0043
0304
0340
0403
0430
3004
3040
3400
4003
4030
4300
#include "stdio.h"
int arr[1000]={0} ;
int count=0 ;
void paixu(int str[],int n)
{
int i,j,temp ;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(str[i]>str[j])
{
temp=str[i];
str[i]=str[j];
str[j]=temp ;
}
}
}
}
void swap(int str[],int a,int b)
{
int temp=str[a];
str[a]=str[b];
str[b]=temp ;
}
void fun(int str[],int start,int end)
{
int i,j ;
if(start==end)
{
for(i=end;i>=0;i--)
{
arr[count]=arr[count]*10+str[i];
// printf("%d",str[i]);
}
// printf("\n");
count++;
}
else
{
for(i=start;i<=end;i++)
{
swap(str,start,i);
fun(str,start+1,end);
swap(str,start,i);
}
}
}
int main()
{
int n,k,flag ;
int i,j ;
int str[6];
scanf("%d",&n);
if(n<10)
{
printf("%d\n",n);
}
else if(n>=10&&n<100)
{
str[0]=n/10 ;
str[1]=n%10 ;
fun(str,0,1);
k=2 ;
}
else if(n>=100&&n<1000)
{
str[0]=n/100 ;
str[1]=n/10%10 ;
str[2]=n%10 ;
fun(str,0,2);
k=3 ;
}
else if(n>=1000&&n<10000)
{
str[0]=n/1000 ;
str[1]=n/100%10 ;
str[2]=n/10%10 ;
str[3]=n%10 ;
fun(str,0,3);
k=4 ;
}
else if(n>=10000&&n<100000)
{
str[0]=n/10000 ;
str[1]=n/1000%10 ;
str[2]=n/100%10 ;
str[3]=n/10%10 ;
str[4]=n%10 ;
fun(str,0,4);
k=5 ;
}
else
{
str[0]=n/100000 ;
str[1]=n/10000%10 ;
str[2]=n/1000%10 ;
str[3]=n/100%10 ;
str[4]=n/10%10 ;
str[5]=n%10 ;
fun(str,0,5);
k=6 ;
}
paixu(arr,count);
for(i=0;i<count;i++)
{
if(arr[i]!=arr[i+1])
{
if(k==2)
{
printf("%02d\n",arr[i]);
}
if(k==3)
{
printf("%03d\n",arr[i]);
}
if(k==4)
{
printf("%04d\n",arr[i]);
}
if(k==5)
{
printf("%05d\n",arr[i]);
}
if(k==6)
{
printf("%06d\n",arr[i]);
}
}
}
return 0 ;
}
在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否有变多。可是一段时间观察下来,阮小二发现自己账户的钱增长好慢啊,碰到节假日的时候连个铜板都没进,更郁闷的是这些天分文不进就算了,可恨的是银行这几天还有可能“落井下石”(代扣个人所得税),看着自己账户的钱被负增长了,阮小二就有被割肉的感觉(太痛苦了!),这时阮小二最大的愿望无疑是以最快的速度日进斗金,可什么方法能够日进斗金呢?抢银行(老本行)?不行,太危险,怕有命抢没命花;维持现状?受不了,搂钱太慢了!想来想去,抓破脑袋之后,终于想到了能快速发家致富的法宝----买彩票,不但挣了钱有命花,运气好的话,可以每天中他个几百万的,岂不爽哉!抱着这种想法,阮小二开始了他的买彩票之旅。想法是“好的”(太天真了OR
太蠢了),可是又发现自己的数学功底太差,因为不知道数字都有哪些组合排列?那现在就请同学们写个递归程序,帮助阮小二解决一下这个问题吧!
输入格式
不超过6位数的正整数N,注意:构成正整数N的数字可重复
输出格式
组成正整数N的所有位数的全排列,这些排列按升序输出,每个排列占一行。
注意:输出数据中不能有重复的排列
样例输入
123
样例输出
123
132
213
231
312
321
样例输入
3121
样例输出
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
样例输入
4003
样例输出
0034
0043
0304
0340
0403
0430
3004
3040
3400
4003
4030
4300
#include "stdio.h"
int arr[1000]={0} ;
int count=0 ;
void paixu(int str[],int n)
{
int i,j,temp ;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(str[i]>str[j])
{
temp=str[i];
str[i]=str[j];
str[j]=temp ;
}
}
}
}
void swap(int str[],int a,int b)
{
int temp=str[a];
str[a]=str[b];
str[b]=temp ;
}
void fun(int str[],int start,int end)
{
int i,j ;
if(start==end)
{
for(i=end;i>=0;i--)
{
arr[count]=arr[count]*10+str[i];
// printf("%d",str[i]);
}
// printf("\n");
count++;
}
else
{
for(i=start;i<=end;i++)
{
swap(str,start,i);
fun(str,start+1,end);
swap(str,start,i);
}
}
}
int main()
{
int n,k,flag ;
int i,j ;
int str[6];
scanf("%d",&n);
if(n<10)
{
printf("%d\n",n);
}
else if(n>=10&&n<100)
{
str[0]=n/10 ;
str[1]=n%10 ;
fun(str,0,1);
k=2 ;
}
else if(n>=100&&n<1000)
{
str[0]=n/100 ;
str[1]=n/10%10 ;
str[2]=n%10 ;
fun(str,0,2);
k=3 ;
}
else if(n>=1000&&n<10000)
{
str[0]=n/1000 ;
str[1]=n/100%10 ;
str[2]=n/10%10 ;
str[3]=n%10 ;
fun(str,0,3);
k=4 ;
}
else if(n>=10000&&n<100000)
{
str[0]=n/10000 ;
str[1]=n/1000%10 ;
str[2]=n/100%10 ;
str[3]=n/10%10 ;
str[4]=n%10 ;
fun(str,0,4);
k=5 ;
}
else
{
str[0]=n/100000 ;
str[1]=n/10000%10 ;
str[2]=n/1000%10 ;
str[3]=n/100%10 ;
str[4]=n/10%10 ;
str[5]=n%10 ;
fun(str,0,5);
k=6 ;
}
paixu(arr,count);
for(i=0;i<count;i++)
{
if(arr[i]!=arr[i+1])
{
if(k==2)
{
printf("%02d\n",arr[i]);
}
if(k==3)
{
printf("%03d\n",arr[i]);
}
if(k==4)
{
printf("%04d\n",arr[i]);
}
if(k==5)
{
printf("%05d\n",arr[i]);
}
if(k==6)
{
printf("%06d\n",arr[i]);
}
}
}
return 0 ;
}
相关文章推荐
- Matplotlib 中文用户指南 3.2 图像教程
- Python基础知识
- poj 3801 Crazy Circuits (有源汇有上下界的最小流)
- 1分钟完成MySQL5.6生产库自动化安装部署
- windows下 实现radis 集群
- C++ 虚函数表解析
- [python3教程]第二章.使用解释器
- xml 表格
- vim配置文件和插件管理
- 多线程对各种变量共享
- 【LeetCode】55. Jump Game
- Android中pendingIntent的深入理解
- 数据库的隔离级别
- PS笔记--day2
- swing 相关API
- Android 属性动画和View动画的特别之处
- 如何提高 C/C++ 编程能力?
- C++ Primer 5th Answers
- STM32开发板按键实验
- 怎么提高c或c++编程能力?