基础回顾第2题
2、已知:一个任意的四位正整数。将数字重新组合成一个最大的数和最小的数相减,重复这个过程,最多七步,必得6174。即:7641-1467=6174。将永远出不来。求证:所有四位数数字(全相同的除外),均能得到6174。输出掉进黑洞的步数。
解:
①主要硬件软件环境:VC6.0
②设计思路:对输入的四位数n分别求出各位数字,并对各位数字重新排序,求出一个最大的四位数和最小的四位数,把最大的四位数和最小的四位数相减重新赋值给n,重复上述过程,当最后等于6174时结束循环
③程序和运行结果:
#include
int p(int n);//设计一个函数反复调用
int n;
using namespace std;
void main()
{
int time=1,n1;
cout<<"请输入一个四位正整数(各位数字全相同的除外):"<
cin>>n;
cout<<"掉进黑洞的步数:";
if(n==6174)
cout<<"0"<
if(n!=6174)
{
n1=p(n);
while(n1!=6174)
{
n1=p(n1);
time++;
}
cout<
}
}
int p(int n)
{
int a,b,c,d;
int i,j,k,t;
a=n/1000;//求各位数字
b=(n-a*1000)/100;
c=(n-a*1000-b*100)/10;
d=(n-a*1000-b*100-c*10);
int s[4]={a,b,c,d};//定义一个数组存放要排序的各位数字
for(i=0;i<3;i++)
{
k=i;
for(j=i+1;j<4;j++)
if(s[j]
k=j;
t=s[k];
s[k]=s[i];
s[i]=t;//选择排序法s[0]到s[3]升序排列
}
int e=(s[3]*1000+s[2]*100+s[1]*10+s[0])-(s[0]*1000+s[1]*100+s[2]*10+s[3]);
return e;
}
④小结(分析存在的问题)方法2
#include
int p(int n);//设计一个函数反复调用
using namespace std;
void main()
{
int n,time=0;//步数置0
cout<<"请输入一个四位正整数(各位数字全相同的除外):"<
cin>>n;
cout<<"掉进黑洞的步数:";
if(n==6174)
cout<<"0"<
if(n!=6174)
{
while(n!=6174)
{
n=p(n);
time++;
}
cout<
}
}
int p(int n)
{
bool flag;
int s[4],i,j,t;
for(i=0;i<4;i++)
{
s[i]=n%10;
n=n/10;
}
for(i=0;i<4;i++)
{
flag=false;
for(j=0;j<3-i;j++)
{
if(s[j]>s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;//冒泡排序法s[0]到s[3]升序排列
flag=true;
}
}
if(!flag)break;
}
int e=(s[3]*1000+s[2]*100+s[1]*10+s[0])-(s[0]*1000+s[1]*100+s[2]*10+s[3]);
return e;
}
本文来源:https://www.2haoxitong.net/k/doc/dfabf74fc850ad02de804115.html
文档为doc格式