著名的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;
}
程序截图:
补录:如果有观众朋友们对上述代码不清楚的地方,欢迎前来指教