【藍橋杯】ADV-170 數字黑洞

  • 2019 年 11 月 8 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_42449444/article/details/89841277

題目描述:

任意一個四位數,只要它們各個位上的數字是不全相同的,就有這樣的規律: 1)將組成該四位數的四個數字由大到小排列,形成由這四個數字構成的最大的四位數; 2)將組成該四位數的四個數字由小到大排列,形成由這四個數字構成的最小的四位數(如果四個數中含有0,則得到的數不足四位); 3)求兩個數的差,得到一個新的四位數(高位零保留)。 重複以上過程,最後一定會得到的結果是6174。 比如:4312 3087 8352 6174,經過三次變換,得到6174

輸入格式:

一個四位整數,輸入保證四位數字不全相同。

輸出格式:

一個整數,表示這個數字經過多少次變換能得到6174。

輸入樣例:

4312

輸出樣例:

3

解題思路:

這道題跟【PAT乙級】數字黑洞【PAT甲級】The Black Hole of Numbers類似。假設輸入的數字經過cnt次變換後能得到6174,先將輸入的那個四位整數拆成4個數字放入一個數組中,然後用這4個數字升序排列、降序排列分別組成最小的數字和最大的數字,用大數減去小數可以得到一個新的數字,如果新的數字是6174就輸出cnt即可。看了PAT的那倆題之後就會發現藍橋杯這題有個小小的疏漏:當輸入的數字各十百千位的數都是一樣的時候,是得不到6174的,比如2222。

AC程式碼:

#include <bits/stdc++.h>  using namespace std;    int arr2num(int a[])   //把數組中的數按照下標順序組成一個新的數字  {      int n = 0;      for(int i = 0; i < 4; i++)      {          n = n*10 + a[i];      }      return n;  }    int main()  {      int n;      cin >> n;      int a[4];      int cnt = 0;   //經過cnt次變換能得到6174      do{          for(int i = 0; i < 4; i++)   //把各位數存入數組裡面          {              a[i] = n%10;              n /= 10;          }          sort(a,a+4);   //升序排列          int x = arr2num(a);   //得到由數組a中元素組成的最大數字          sort(a,a+4,greater<int>());  //降序排列          int y = arr2num(a);  //得到由數組a中元素組成的最小數字          n = y-x;   //作差得到一個新的四位數          cnt++;      }while(n != 6174);      cout << cnt << endl;      return 0;  }