6174问题!!!

问题的描述:

       假设你有一个数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大排序得到b,然后用a-b

替换原来这个数字,并且继续操作,直到出现循环(就是得到的新的数字原来出现过),输入保证在循环之前最多只会

产生1000个整数.


思想 : 在写这个题的时候虽然我有思路,但是我的思路不是很清楚,所以我采用了画图法,不过画个图看起来

非常的清楚啊,准备以后都使用这样的方法,但是画图的过程中我发现,最好使用顺序结构,不要在图中出现循环,

这样做,是保证了程序的清晰,也保证了程序执行效率,我一开始画的图非常的复杂,但是我把答案的图画出来,十分的

简单,清晰,一看就懂.(本人强烈推荐,使用画图法解决这类问题)



/*
** 6174 问题
** 1.输入这个数字,这个程序就是进行一次的输入,并输出
** 2.转化出下一个数字,并输出,判断一下这个数字是否出现过
** 3.出现过,break,没有出现过,再次循环
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int next_array( char buf[], int len ){
    int i = 0,j = 0;

    for(i = 0; i < len; i++){
        for(j = i+1; j < len; j++){
            if(buf[i] > buf[j]){
                char temp = buf[i];
                buf[i] = buf[j];
                buf[j] = temp;
            }
        }
    }

    int num1 = 0;
//    printf( "buf = %s\n", buf);
    sscanf( buf, "%d", &num1);
    char temp = buf[0]; buf[0] = buf[len-1]; buf[len-1] = temp;
         temp = buf[1]; buf[1] = buf[len-2]; buf[len-2] = temp;
    
    int num2 = 0;
    sscanf( buf, "%d", &num2);
//    printf( "buf = %s\n", buf);

    return num2 - num1;
}

        


int main( void ){
    int num = 0;
    int count = 0;
    int Array[2000] = {};
    char buf[10] = {};
    int i = 0,j = 0;
    int ok = 0;

    scanf( "%d", &num );
    printf( "%d", num );


    while( 1 ){
        ok = 0;
        Array[count++] = num;
        sprintf( buf, "%d", num );

        num = next_array( buf, strlen(buf) );
        printf( " -> %d" , num);

        for( i = 0; i < count; i++){
            if( num == Array[i] ){
                ok = 1;    
            }
        }

        if( ok ) break;
    }

    printf( "\n" );
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值