算法競賽入門 5.3.1 6174問題

知識點:1.排序(冒泡法);

2.字符串逆轉(每次首尾交換,或者用一個等大的數組遍歷一次);

3.標記是否是重複數字(用10000+數組存儲出現的數字,數字爲下標,用1標記存在,或者用數字爲內容,但需要每次查找遍歷一次數組)


實現代碼:

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

#define MAX 10010
using 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;
}


發佈了56 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章