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
原创粉丝点击