把题面定义“负数就是在正数前加负号”当词法规则: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;
}