正负数

GitHub跳转原题关系图返回列表

把题面定义“负数就是在正数前加负号”当词法规则:token 首字符为 - 则原样输出,否则前补负号,字符串分派避免 float 往返破坏书写格式。

OJ: roj

题目 ID: 1006

难度:入门

标签:字符串python

创建: 2026-09-29 12:44

更新: 2026-10-04 22:22

题目描述

小叶子刚学会了负数,她觉得很有意思:负数就是在正数前加负号(-)。她决定写个程序,不管输入是正数还是负数,输出结果都为负数。例如:输入 1,输出 -1;输入 -1.5,输出 -1.5。

输入文件中只有一个不为 0 的数(可能以 - 开头,可能含小数点);输出文件中只有一个负数,且数字部分要和输入逐字符相同(小数位、尾随零原样保留)。

思路

题面要的是“负数形式的原样书写”,这是书写形式操作而不是数值运算:把输入读成一个字符串,首字符是 - 就原样输出,否则在最前面补一个 -。千万不要用 float 读入再取负——往返会丢掉尾随零,大数还会变成科学计数法。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 12:44
# update_at: 2026-09-29 12:44

import sys


def solve() -> None:
    """读入一个非 0 的数,输出它的负数形式:已是负数保持原样,否则补一个负号。"""
    num_str = sys.stdin.read().strip()  # 整个输入只有一个 token,去掉首尾空白
    already_negative = num_str.startswith('-')
    print(num_str if already_negative else '-' + num_str)


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-04 22:22
 * update_at: 2026-10-04 22:22
 */

// 题意:输入一个不为 0 的数的书写串(可能是正数也可能是负数,可能带小数点),
// 输出它的负数书写:已是负数就原样输出,是正数就在最前面补一个负号。
// 关键点:这是“书写形式”的操作,不是数值运算——必须按字符串处理,
// 数字部分逐字符保留,不能用 float 读入(会丢失尾随零、大数变科学计数法)。

#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

typedef long long ll;

// 保存输入的那个数的书写串(整个输入只有一个 token)
string num_str;

int main() {
    // 输入只有一个数,用 scanf("%s") 读入一个不含空白的 token
    char buf[105];
    scanf("%s", buf);
    num_str = string(buf);

    // 如果已经以 '-' 开头,它已是负数书写,原样输出;
    // 否则在最前面补一个负号。两种情况数字部分都逐字符不动。
    if (!num_str.empty() && num_str[0] == '-')
        printf("%s\n", num_str.c_str());
    else
        printf("-%s\n", num_str.c_str());
    return 0;
}