{ }codelper
判断函数P0196

整齐的储物柜号码

一所爱整洁的学校会先分配编号为“整齐号码”的储物柜。
一个数从左边的位开始读,如果每一位数字都大于或等于紧挨着它左边那一位的数字,它就是整齐号码。
例如 1123、7、0 是整齐号码,而 1231(3 后面是 1)和 10 不是。
一位数都是整齐号码。
第一行给出储物柜号码的个数 n,接下来 n 行每行给出一个号码。
对每个号码,如果是整齐号码就输出一行 "是",否则输出 "否"。
最后一行输出整齐号码的个数。
试着写一个接收一个号码、以真或假返回它是否整齐的函数,并使用它。

输入
1 ≤ n ≤ 1,000。
0 ≤ 号码 < 10^18(最多 18 位),号码不是 0 时最高位不是 0。
输出
n+1 行:每个号码输出 yes 或 no,最后一行是 yes 的个数
样例 1 · stdin
4
1123
1231
7
10
stdout
是
否
是
否
2
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

返回真或假的函数要写成“只要发现一处不对就立刻返回假,全部看完才返回真”。
布尔类型的名字各语言不同: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);