6174问题求解
来源:互联网 发布:单片机push 编辑:程序博客网 时间:2024/05/01 09:50
著名的6147问题如下:
输入一个四位数,将其各位数字排大小,排成升序和降序两种形式,然后相减得到新数,最后对新数再进行如上操作,直到重复为止。例如:从1234出发 得到 4321-1234 =3087,然后对3087再进行如上操作样例输入:1234样例输出:1234->3087->8352->6174
我的思路:
(1)先写出原数获得新数的操作
通过函数up(),getB()完成,getB是指获得新数的意思
up函数完成了将四个混乱的数排序并且返回题干中3087的那种操作
getB函数利用up函数把一个四位数变成新的四位数
(2)写出判断新出现的数是否和原来的数重复的操作
通过istrue函数来判断,istrue函数有三个参数 num,k,temp
num指存储每次转换后的数的数组k指每次妄图加进num数组的数temp指新加进来的数该在数组中的位置 如果没有重复该函数就会返回1,重复就会返回0
(3)主函数内写的是啥 ⊙0⊙
主函数初始化了 num,将宏定义的初始数赋为 num[0];然后初始化了统计多少次会重复的计数变量count
附上源码:
#include <iostream>using namespace std;#define X 1234 //更改X获得初始数#define N 10000 //用来存放得到的数的矩阵规模int up(int a,int b,int c,int d){ //得到新数的函数 int num[4]={a,b,c,d}; int temp ; for(int i=0;i<4;i++){ for(int j=i+1;j<4;j++){ if(num[j]>num[i]){ temp = num[j]; num[j]= num[i]; num[i]=temp; } } } temp=(1000*num[0]+100*num[1]+10*num[2]+num[3])-(1000*num[3]+100*num[2]+10*num[1]+num[0]); return temp;}int getB(int num){ int a,b,c,d; a=num%10; b=num%100/10; c=num%1000/100; d=num/1000; return up(a,b,c,d);}int istrue(int num[10000],int k,int temp){ for(int i=0;i<temp;i++){ if(num[i]==k) return 0; } return 1;}void main(){ int num[N],t=0,count=1; //count记录下不重复的有多少 num[t]=X; while(istrue(num,getB(num[t]),t+1)){ //此处为伪代码,未实现 count++; //count记录了访问的次数 t++; num[t]=getB(num[t-1]); } num[count]=getB(num[t]); //cout<<count<<endl; for(int i=0;i<count;i++) cout<<num[i]<<"->"; cout<<num[count]<<endl;}
程序截图:
补录:如果有观众朋友们对上述代码不清楚的地方,欢迎前来指教
0 0
- 6174问题求解
- 问题求解
- 问题求解
- 问题求解
- c/c++ 求解 (问题求解)
- 问题求解,问题方案!
- 汉偌塔问题求解方法
- dll问题求解
- 算法问题求解
- 八皇后问题求解
- 求解级数问题
- 求解八皇后问题
- 经典栈问题求解
- spring+hibernate问题(求解)
- 8皇后问题求解
- Josephus问题求解
- 求解约瑟夫环问题
- 求解JOSEPHUS问题
- 关闭看门狗
- iptables的详细介绍及配置方法
- Cisco vWSA (virtual Web Security Appliance)
- API
- 配置虚拟域名
- 6174问题求解
- 给你一次机会面试架构师 你会问什么问题?
- static 与 extern
- Lingo学习心得&2014年研究生数模竞赛E题
- 关闭中断
- 数论题集
- 全局异常处理
- 编程之类 数字号码《-》单词之间的转换
- os.Open()和os.OpenFile()