算法竞赛入门 5.3.1 6174问题

来源:互联网 发布:好吃的零食知乎 编辑:程序博客网 时间:2024/06/16 08:44

知识点:1.排序(冒泡法);

2.字符串逆转(每次首尾交换,或者用一个等大的数组遍历一次);

3.标记是否是重复数字(用10000+数组存储出现的数字,数字为下标,用1标记存在,或者用数字为内容,但需要每次查找遍历一次数组)


实现代码:

#include <iostream>#include <string.h>#include <stdio.h>#define MAX 10010using namespace std;int GetNext(int n);int num[MAX];int main(){    memset(num,0,sizeof(num));    int n;//    cin >> n;    n = 1234;    cout << n;    while(num[n] == 0){        num[n] = 1;        n = GetNext(n);        cout << " -> " << n;    }    return 0;}int GetNext(int n){    char buf[10];    sprintf(buf,"%d",n);    //冒泡法排序    for(int i=1 ; i<4 ; i++){        for(int j=0 ; j<4-i ; j++){            if(buf[j] > buf[j+1]){                char temp = buf[j];                buf[j] = buf[j+1];                buf[j+1] = temp;            }        }    }    int a,b;    sscanf(buf,"%d",&a);//    char buf2[10];//    for(int i=0 ; i<4 ; i++){//        buf2[3-i] = buf[i];//    }//    sscanf(buf2,"%d",&b);    //每次首尾交换    for(int i=0 ; i<4/2 ;i++){        char temp = buf[i];        buf[i] = buf[3-i];        buf[3-i] = temp;    }    sscanf(buf,"%d",&b);    return b - a;}


0 0