HIT1002

这道题目的链接: http://acm.hit.edu.cn/hojx/showproblem/1002/

题目: For each pair of integers A B and C ( -2^31 <= A, B, C<= 2^31-1 ), Output the result of A+B+C on a single line.
Hint: 请注意32位机上int的表示范围

刚拿到这道题的时候,感觉看不明白提示,隐隐约约觉得好像和int数值在计算机中表示的范围有关系,具体说为啥,不知道,印象中和字节有关吧。还有这个2的31次幂-1是个什么鬼啊,怎么办?好慌啊,好想弄明白啊,但超烦这种细枝末节的东西,然并卵,我忍了,准备开始探寻一波这里面数字的奥秘。

查了若干资料后,涨姿势,为了方便,总结一下:

【基本概念】

二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。

其中8bit就称为一个字节(Byte),字节是计算机处理数据的基本单位,即以字节为单位解释信息。

字(word),计算机一次存取、处理和传输的数据长度称为字,即:一组二进制数码作为一个整体来参加运算或处理的单位。一个字通常由一个或多个字节构成,用来存放一条指令或一个数据。

字长一个字中所包含的二进制数的位数称为字长。不同的计算机,字长是不同的,常用的字长有8位、16位、32位和64位等,也就是经常说的8位机、16位机、32位机或64位机。
例如,一台计算机如果用8个二进制位表示一个字,就说该机是八位机,或者说它的字长是8位的;又如,一个字由两个字节组成,即16个二进制位,则字长为16位。字长是衡量计算机性能的一个重要标志。字长越长,一次处理的数字位数越大,速度也就越快。

【本题应用】
32位机器中,int型的数据占4个字节,表示的范围有限,为-2^31到2^31-1(这个范围与有符号整数在计算机中的表示[补码]有关,本篇博客中不展开介绍,可以自行查阅相关资料)。超出这个范围的整数,可以用64位整数表示,其中有符号的64位整数表示的范围是-2^63到2^63-1,同时还有无符号的64位整数。当然超出这些范围的整数只能采用高精度数的方法来进行处理。本题中显然说明了三个数均满足-2^31 <= A, B, C<= 2^31-1,他们相加的结果在64位整数表示的范围内,所以本题应该通过处理64位整数的方法来处理三者相加的结果。

【64位整数定义和处理】
不同的编译器有不同的64位整数定义和处理方法。以下分别介绍Visual C++和G++两种编译器的处理。

  • Visual C++使用类型说明符"__int64""unsigned __int64"
    来分别定义有符号64位无符号64位整型变量,在输入输出时要分别用"%I64d""%I64u"格式控制符。下面的代码可以输入/输出64位有符号整数
__int64 a;
scanf("%I64d",&a);
printf("%I64d\n",a);
  • G++使用类型说明符"long long""unsigned long long"
    来分别定义有符号64位和无符号64位整型变量,在输入/输出时要分别用"%lld""%llu"格式控制符。下面的代码可以输入/输出64位有符号整数:
long long a;
scanf("%lld",&a);
printf("%lld\n",a);

【题解】

#include<stdio.h>
int main(){
   long long a,b,c;
   while(scanf("%lld%lld%lld",&a,&b,&c)==3)
      printf("%lld\n",a+b+c);
   return 0;
}
public String fixData() { logger.info("开始修正T_ATML_CONTROL_HIT表中的错误名字(仅修复乱序姓名)"); int totalFixed = 0; int totalChecked = 0; List<AtmlControlHit> toSave = new ArrayList<>(); // 1. 获取所有正确的名字,并建立:signature -> 正确名字 的映射 Map<String, String> signatureToCorrectName = new HashMap<>(); Set<String> correctNames = new HashSet<>(); // 收集受益所有人名字 List<AtmlBeneficiaryInfo> beneficiaries = atmlBeneficiaryInfoRepository.findAll(); if (beneficiaries != null) { for (AtmlBeneficiaryInfo b : beneficiaries) { String name = b.getOwnerName(); if (name != null && !name.trim().isEmpty()) { name = name.trim(); correctNames.add(name); String sig = getSortedSignature(name); signatureToCorrectName.put(sig, name); // 如果多个同 signature,保留任意一个即可 } } } // 收集实体信息名字 List<AtmlEntityInfo> entities = atmlEntityInfoRepository.findAll(); if (entities != null) { for (AtmlEntityInfo e : entities) { String name = e.getOwnerName(); if (name != null && !name.trim().isEmpty()) { name = name.trim(); correctNames.add(name); String sig = getSortedSignature(name); signatureToCorrectName.put(sig, name); } } } logger.info("共加载 {} 个正确名字,构建了 {} 个签名映射", correctNames.size(), signatureToCorrectName.size()); // 2. 获取需要修复的数据 List<AtmlControlHit> hits = atmlControlHitRepository.findAtmlControlHitByMatchRule("姓名"); if (hits == null || hits.isEmpty()) { logger.info("未找到待处理记录"); return "无数据需要处理"; } // 构建 subject_type 映射(用于联动更新) Map<String, String> nameToSubjectType = new HashMap<>(); for (AtmlControlHit hit : hits) { String name = hit.getName(); String subjectType = hit.getSubjectType(); if (name != null && !name.trim().isEmpty() && subjectType != null && !subjectType.trim().isEmpty() && correctNames.contains(name.trim())) { nameToSubjectType.put(name.trim(), subjectType); } } // 3. 遍历每条记录进行修复 for (AtmlControlHit hit : hits) { try { String name = hit.getName(); String subject = hit.getSubject(); if (name == null || name.trim().isEmpty() || subject == null || subject.trim().isEmpty()) continue; totalChecked++; name = name.trim(); subject = subject.trim(); boolean needUpdate = false; String newName = name; String newSubject = subject; String newSubjectType = hit.getSubjectType(); // === 修复 name 字段 === if (!correctNames.contains(name)) { String sig = getSortedSignature(name); if (signatureToCorrectName.containsKey(sig)) { String corrected = signatureToCorrectName.get(sig); if (!name.equals(corrected)) { newName = corrected; needUpdate = true; logger.info("修正乱序 name: {} -> {}", name, newName); } } } // === 修复 subject 字段 === if (!correctNames.contains(subject)) { String sig = getSortedSignature(subject); if (signatureToCorrectName.containsKey(sig)) { String corrected = signatureToCorrectName.get(sig); if (!subject.equals(corrected)) { newSubject = corrected; needUpdate = true; logger.info("修正乱序 subject: {} -> {}", subject, newSubject); } } } // === 联动规则:如果 name 被修正,且原 subject == 原 name,则同步修正 subject === if (needUpdate && subject.equals(name)) { newSubject = newName; logger.debug("subject name 相同,同步修正为: {}", newSubject); } // === 更新 subject_type === if (needUpdate) { // 优先使用新 name 的 type if (nameToSubjectType.containsKey(newName)) { newSubjectType = nameToSubjectType.get(newName); } else if (nameToSubjectType.containsKey(newSubject)) { newSubjectType = nameToSubjectType.get(newSubject); } } // 应用修改 if (needUpdate) { logger.info("修正记录 - trowId={}, name:{}→{}, subject:{}→{}", hit.getTrowId(), name, newName, subject, newSubject); hit.setName(newName); hit.setSubject(newSubject); hit.setSubjectType(newSubjectType); toSave.add(hit); totalFixed++; } } catch (Exception e) { logger.error("处理记录异常 trowId=" + hit.getTrowId(), e); } } // 批量保存 if (!toSave.isEmpty()) { // atmlControlHitRepository.save(toSave); logger.info("批量保存 {} 条修正记录", toSave.size()); } logger.info("修正完成。共检查 {} 条记录,修正了 {} 条记录", totalChecked, totalFixed); return String.format("修正完成。共检查 %d 条记录,修正了 %d 条记录", totalChecked, totalFixed); } 这是方法,subject_type修改的条件是什么
最新发布
11-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值