返回真或假的函数要写成“只要发现一处不对就立刻返回假,全部看完才返回真”。 布尔类型的名字各语言不同:Python bool(True/False),JS、TS boolean,Java boolean,C# bool,C++ bool,C 用 <stdbool.h> 的 bool(旧式 C 用 int 返回 0、1),Craykon 用 返回 返回值 真/假。 Python 也可以写成一行 all(a <= b for a, b in zip(s, s[1:]))。 数字字符的编码顺序就是数字的大小顺序,所以不必转成数,直接比较 s[i] > s[i + 1] 即可。 四个陷阱:① 在循环里写了 if 不对: return False 之后又加上 else: return True,只看第一对就返回真(1231 变成 yes)。 ② 相同数字连着出现(112)也是整齐号码。 只有变小时才是假,所以要用 > 而不是 >=。 ③ JS 中 forEach 里的 return false 只结束那一次回调,不会结束外层函数,所以函数总是返回 true。 要中途退出,请用 for 循环或 every(在 Java、C# 的 lambda 里写 return false 根本无法编译)。 ④ 号码最多 18 位,放不进 int(约 21 亿)。 Java Integer.parseInt 会抛异常,C scanf("%d") 会溢出。 按字符串读取就不用担心大小。
Pythonmain.py · 17 行
def is_tidy(s): """왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 True""" for i in range(len(s) - 1): if s[i] > s[i + 1]: return False return True # 끝까지 다 본 뒤에야 참이라고 말할 수 있다n = int(input())count = 0for _ in range(n): if is_tidy(input().strip()): print("是") count += 1 else: print("否")print(count)
JavaScriptmain.js · 23 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");// 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 truefunction isTidy(s) { for (let i = 0; i + 1 < s.length; i++) { if (s[i] > s[i + 1]) return false; } return true;}const n = Number(lines[0]);const out = [];let count = 0;for (let i = 1; i <= n; i++) { if (isTidy(lines[i].trim())) { out.push("是"); count++; } else { out.push("否"); }}out.push(count);console.log(out.join("\n"));
TypeScriptmain.ts · 25 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");// 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 truefunction isTidy(s: string): boolean { for (let i = 0; i + 1 < s.length; i++) { if (s[i] > s[i + 1]) return false; } return true;}const n: number = Number(lines[0]);const out: string[] = [];let count = 0;for (let i = 1; i <= n; i++) { if (isTidy(lines[i].trim())) { out.push("是"); count++; } else { out.push("否"); }}out.push(String(count));console.log(out.join("\n"));
JavaMain.java · 28 行
import java.io.*;public class Main { // 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 true static boolean isTidy(String s) { for (int i = 0; i + 1 < s.length(); i++) { if (s.charAt(i) > s.charAt(i + 1)) return false; } return true; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine().trim()); StringBuilder sb = new StringBuilder(); int count = 0; for (int i = 0; i < n; i++) { if (isTidy(br.readLine().trim())) { sb.append("是\n"); count++; } else { sb.append("否\n"); } } sb.append(count).append('\n'); System.out.print(sb); }}
C#Main.cs · 36 行
using System;using System.Text;class Program{ // 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 true static bool IsTidy(string s) { for (int i = 0; i + 1 < s.Length; i++) { if (s[i] > s[i + 1]) return false; } return true; } static void Main() { int n = int.Parse(Console.ReadLine()!.Trim()); var sb = new StringBuilder(); int count = 0; for (int i = 0; i < n; i++) { if (IsTidy(Console.ReadLine()!.Trim())) { sb.Append("是\n"); count++; } else { sb.Append("否\n"); } } sb.Append(count).Append('\n'); Console.Write(sb); }}
C++main.cpp · 27 行
#include <iostream>#include <string>// 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 truebool isTidy(const std::string& s) { for (size_t i = 0; i + 1 < s.size(); i++) { if (s[i] > s[i + 1]) return false; } return true;}int main() { std::ios::sync_with_stdio(false); int n, count = 0; std::string s; std::cin >> n; for (int i = 0; i < n; i++) { std::cin >> s; if (isTidy(s)) { std::cout << "是\n"; count++; } else { std::cout << "否\n"; } } std::cout << count << "\n";}
Cmain.c · 29 行
#include <stdbool.h>#include <stdio.h>#include <string.h>// 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 truebool is_tidy(const char *s) { size_t len = strlen(s); for (size_t i = 0; i + 1 < len; i++) { if (s[i] > s[i + 1]) return false; } return true;}int main(void) { int n, count = 0; char s[32]; // 18자리까지라 문자열로 읽는다 scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%31s", s); if (is_tidy(s)) { puts("是"); count++; } else { puts("否"); } } printf("%d\n", count); return 0;}
Craykonmain.cray · 28 行
// 왼쪽에서 오른쪽으로 숫자가 작아지는 곳이 한 번도 없으면 참정리된번호인가(s){ 循环 (i = 0; i + 1 < s.长度; i++) { 如果 (s[i] > s[i + 1]) { 返回 假; } } 返回 真; // 끝까지 다 본 뒤에야 참이라고 말할 수 있다}n = 控制台.读行().转数字();count = 0;循环 (k = 0; k < n; k++){ 如果 (정리된번호인가(控制台.读行().去空白())) { 控制台.输出("是"); count++; } 否则 { 控制台.输出("否"); }}控制台.输出(count);