您的位置:首页 > 其它

6174问题求解

2015-08-25 19:13 381 查看
著名的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
,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;
}


程序截图:


补录:如果有观众朋友们对上述代码不清楚的地方,欢迎前来指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: