C语言题目,具体如下 5

题目描述假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来的数,并且继续操作。例如,从1234出发,依次可以... 题目描述

假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来的数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174.有趣的是,7641-1467=6174,回到了它自己。输入一个n位数,输出操作序列,直到出现循环(即新得到的数曾经得到过).输入保证在循环之前最多只会产生1000个整数。
输入样例

1234

输出样例

1234->3087->8352->6174->6174
展开
 我来答
巨宾实0Fm62c
2013-12-31 · TA获得超过337个赞
知道答主
回答量:140
采纳率:0%
帮助的人:55万
展开全部

#include<stdio.h>

main()

{

while(1)

{

int n,i,j,min,max,t,x;

char  k[4];

printf("请输入一个四位数且各个位上的数都不相同: ");

scanf("%d",&n);//获取输入的数值

printf("%d→",n);//输出第获取的值

k[0]=n%10;//得到各个位上的数值

k[1]=n/10%10;

k[2]=n/100%10;

k[3]=n/1000;

for(i=0;i<=3;i++)//给各个位上的数字排序

for(j=0;j<4;j++)

{

if(k[i]>k[j])

{

t=k[i];

k[i]=k[j];

k[j]=t;

}

}

max=k[0]*1000+k[1]*100+k[2]*10+k[3];//得到最大值

min=k[3]*1000+k[2]*100+k[1]*10+k[0];//得到最小值

if(n==max-min)//将最大值域最小值的差与输入值相比较,相同则输出,不相同则,再排序比较

printf("%d",n);

else for(i=0;i<1000;i++)//最多循环1000次直至满足条件

{

            x=max-min;

k[0]=x%10;//得到各个位上的数值

k[1]=x/10%10;

k[2]=x/100%10;

k[3]=x/1000;

    for(i=0;i<=3;i++)//给各个位上的数字排序

    for(j=0;j<4;j++)

{

 if(k[i]>k[j])

 {

t=k[i];

k[i]=k[j];

k[j]=t;

 }

}

        max=k[0]*1000+k[1]*100+k[2]*10+k[3];//得到最大值

min=k[3]*1000+k[2]*100+k[1]*10+k[0];//得到最小值

if(x==max-min)//将最大值和最小值的差与输入值相比较,相同则输出且终止循环,不相同则输出,并继续循环

{

printf("%d\n",x);

   break;

}

else

printf("%d→",x);

}

}


}

lgao622
2013-12-31 · 知道合伙人软件行家
lgao622
知道合伙人软件行家
采纳数:1137 获赞数:6548
毕业于武汉工程大学邮电与信息工程学院通信专业,软件行业,4年工作经验。

向TA提问 私信TA
展开全部
#include <stdio.h>
int sort(int n, bool falg)//如果falg为真,便正序输出,否则反序
{
 char a[5], t;
 sprintf(a, "%d", n);
 for(int i= 0; i < 4; i++)
 {
  for(int j= 0; j < 4; j++)
  {
   if(a[i] > a[j])
   {
    t= a[i];
    a[i]= a[j];
    a[j]= t;
   }
  }
 }
 if(falg)
 {
  for(int i= 0; i < 2; i++)
  {
   t= a[i];
   a[i]= a[3-i];
   a[3-i]= t;
  }
 }
 sscanf(a, "%d", &n);
 return n;
}
void main()
{
 int n, m;
 printf("input a num:");
 scanf("%d", &n);
 
 while(true)
 {
  printf("%d->", n);
  m= n;
  n= sort(n, 0) - sort(n, 1);
  
  if(m == n)
   break;
 }
 printf("%d\n", n);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友439f3ac63
2013-12-31 · TA获得超过252个赞
知道小有建树答主
回答量:348
采纳率:0%
帮助的人:62.5万
展开全部
写两个排序的方法,然后相减输出,开辟一个N*10的数组空间默认全部为0,每次从小到大的排序结果为下标设为1,当新的数从小到大排序的下标已经为1时,说明出现了重复。结束
追问
不懂。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
擎天0302
2013-12-31 · TA获得超过112个赞
知道答主
回答量:137
采纳率:100%
帮助的人:57.8万
展开全部
6174 一个经典的问题!最好自己去做,实在做不出来了,在问我要代码!思路很重要!
追问
这个是要用指针做吧?我对指针掌握的比较差。。思路是有,刚尝试写了一堆,但是最后还是写不出来
追答
不用指针!明天给你代码!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式