Advertisement
EckOp

[AutoIT] Số siêu xấu

May 27th, 2016
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 2.73 KB | None | 0 0
  1. #cs ------------ OPDO.VN -----------------------------------------------
  2. Nhập vào số nguyên dương N (0 ≤ N ≤ 10000). Tìm số siêu xấu nhỏ nhất sao cho số đó lớn hơn N. Giả sử dữ liệu nhập vào hợp lệ.
  3. Số siêu xấu là số đối xứng chỉ có các chữ số lẻ 1, 3, 5, 7, 9.
  4. Ví dụ:
  5. Nhập N = 49 kết quả là 55.
  6. Nhập N = 123 kết quả là 131.
  7. Nhập N = 7349 kết quả là 7557.
  8. #ce ---------------------------------------------------------------------
  9. Do
  10.     $number = InputBox('Enter', 'Number')
  11.     If @error Then Exit
  12. Until Number($number) >= 0 And Number($number) <= 10000
  13. $number = Number($number)
  14. $timer = TimerInit()
  15. $kq = _Supper_Ugly_Number($number)
  16. $timerdiff = TimerDiff($timer)
  17. MsgBox(64,'Time '&$timerdiff&'ms', 'Supper Ugly Number of '&$number &' = '& $kq)
  18. Func _Supper_Ugly_Number($number)
  19.     if $number < 10 Then
  20.         Return $number + 2
  21.     Elseif $number < 33 Then
  22.         Return 33
  23.     Elseif $number < 55 Then
  24.         Return 55
  25.     Elseif $number < 77 Then
  26.         Return 77
  27.     Elseif $number < 99 Then
  28.         Return 99
  29.     Elseif $number = 99 or $number = 999 or $number = 9999 Then
  30.         Return StringReplace(String($number),'9','1')&1
  31.     EndIf
  32.     Local $myNumber = StringSplit($number,'')
  33.     Local $numberLen = Number($myNumber[0])
  34.     Local $soHang[Round($numberLen/2)+1]
  35.     For $i = 1 To UBound($soHang)-1
  36.         if $soHang[$i-1] <> '' And Number($soHang[$i-1]) > Number($myNumber[$i-1]) Then
  37.             $soHang[$i] = 1
  38.         Else
  39.             if Mod($myNumber[$i],2) = 1 Then
  40.                 $soHang[$i] = $myNumber[$i]
  41.             Else
  42.                 $soHang[$i] = $myNumber[$i]+1
  43.                 _Tang_So_Hang($soHang, $i)
  44.                 if $soHang[$i] > $myNumber[$i] Then
  45.                     For $j = $i+1 to UBound($soHang)-1
  46.                         $soHang[$j] = 1
  47.                     Next
  48.                     ExitLoop
  49.                 EndIf
  50.             EndIf
  51.         EndIf
  52.     Next
  53.     While 1
  54.     Local $soMoi = _Ghep_Thanh_So($soHang)
  55.     if $numberLen = 2 Then $soMoi = Number($soMoi&$soMoi)
  56.     if Number(_Ghep_So_Xau($soHang, $numberLen)) <= Number($number) Then
  57.         $soHang[UBound($soHang)-1] += 2
  58.         _Tang_So_Hang($soHang, UBound($soHang)-1)
  59.     Else
  60.         ExitLoop
  61.     EndIf
  62.     WEnd
  63.     Return _Ghep_So_Xau($soHang, $numberLen)
  64. EndFunc   ;==>_Supper_Ugly_Number
  65.  
  66. Func _Ghep_So_Xau(ByRef $soHang, $numberLen)
  67.     Local $soMoi = _Ghep_Thanh_So($soHang)
  68.     Local $return
  69.     if Mod($numberLen,2) = 1 Then
  70.         $return = $soMoi&StringReverse(StringTrimRight($soMoi,1))
  71.     Else
  72.         $return = $soMoi&StringReverse($soMoi)
  73.     EndIf
  74.     Return Number($return)
  75. EndFunc
  76.  
  77. Func _Ghep_Thanh_So(ByRef $soHang)
  78.     Local $return
  79.     For $i = 1 to UBound($soHang) -1
  80.         $return &= $soHang[$i]
  81.     Next
  82.     Return $return
  83. EndFunc
  84.  
  85. Func _Tang_So_Hang(ByRef $soHang,$j)
  86.     For $i = $j to 1 Step -1
  87.         if $soHang[$i] >= 10 Then
  88.             $soHang[$i] = 1
  89.         Else
  90.             if $i <> $j then $soHang[$i]+=2
  91.             ExitLoop
  92.         EndIf
  93.     Next
  94. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement