2021-5-8【CCF】【1035. 数根】

本文介绍了一种编程任务,即如何通过算法计算正整数的数根,涉及数字位求和和递归处理的过程。通过实例展示了如何使用C++实现这一功能,并提供了适用于不同数据范围的代码。

题目描述
数根是这样定义的:对于一个正整数n,将它的各个数位上的数字相加得到一个新数,如果这个数是一位数,我们就称之为n的数根,否则重复处理直到它成为一个一位数。
例如,n=34,3+4=7,7是一位数,所以7是34的数根。
再如,n=345,3+4+5=12,1+2=3,3是一位数,所以3是345的数根。
对于输入数字n,编程计算它的数根。

输入
输入正整数n。

输出
输出n的数根。

样例输入
345

样例输出
3

数据范围限制
1<=n<2^31

#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	int s=0;
	cin>>n;
	do{
		while(n){
			s+=n%10;
			n/=10;
		}
		n=s;
		s=0;
	}while(n>=10);
	cout<<n;
	return 0;

}

2025-09-18 09:47:38.200 [reactor-http-nio-2] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkAccessible: true 2025-09-18 09:47:38.200 [reactor-http-nio-2] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkBounds: true 2025-09-18 09:47:38.200 [reactor-http-nio-2] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@7e881c36 2025-09-18 09:47:38.243 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [c658418b, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] New http connection, requesting read 2025-09-18 09:47:38.243 [reactor-http-nio-2] DEBUG reactor.netty.transport.TransportConfig - [c658418b, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)} 2025-09-18 09:47:38.251 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096 2025-09-18 09:47:38.251 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8 2025-09-18 09:47:38.251 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.chunkSize: 32 2025-09-18 09:47:38.251 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.blocking: false 2025-09-18 09:47:38.251 [reactor-http-nio-2] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.batchFastThreadLocalOnly: true 2025-09-18 09:47:38.288 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [c658418b, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] Increasing pending responses, now 1 2025-09-18 09:47:38.299 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServer - [c658418b-1, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] Handler is being applied: org.springframework.http.server.reactive.ReactorHttpHandlerAdapter@721f3cd7 2025-09-18 09:47:38.337 [reactor-http-nio-2] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [c658418b-1] HTTP POST "/master/transportTime/add" 2025-09-18 09:47:38.364 [reactor-http-nio-2] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerMapping - [c658418b-1] Mapped to com.hvlink.controller.TransportTimeController#insert(TransportTimeDTO) 2025-09-18 09:47:38.381 [reactor-http-nio-2] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [c658418b-1] Content-Type:application/json 2025-09-18 09:47:38.391 [reactor-http-nio-2] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [c658418b-1] 0..1 [com.hvlink.entity.dto.TransportTimeDTO] 2025-09-18 09:47:38.411 [reactor-http-nio-2] DEBUG reactor.netty.channel.FluxReceive - [c658418b-1, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] [terminated=false, cancelled=false, pending=0, error=null]: subscribing inbound receiver 2025-09-18 09:47:38.431 [reactor-http-nio-2] DEBUG o.s.http.codec.json.Jackson2JsonDecoder - [c658418b-1] Decoded [TransportTimeDTO(id=null, companyCode=null, supplierCode=null, factoryCode=null, warehouseCode=null, (truncated)...] 2025-09-18 09:47:38.449 [reactor-http-nio-2] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [com.hvlink.service.impl.TransportTimeServiceImpl.insert]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 2025-09-18 09:47:38.645 [reactor-http-nio-2] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited 2025-09-18 09:47:39.108 [reactor-http-nio-2] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [ConnectionID:1 ClientConnectionId: 69f1048c-e727-4578-a768-9bd8edc01bc9] for JDBC transaction 2025-09-18 09:47:39.112 [reactor-http-nio-2] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [ConnectionID:1 ClientConnectionId: 69f1048c-e727-4578-a768-9bd8edc01bc9] to manual commit 2025-09-18 09:47:39.140 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-09-18 09:47:39.152 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17d2ae20] 2025-09-18 09:47:39.189 [reactor-http-nio-2] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: 69f1048c-e727-4578-a768-9bd8edc01bc9] will be managed by Spring 2025-09-18 09:47:39.192 [reactor-http-nio-2] DEBUG c.h.m.master.TransportTimeMapper.existsByCodes - ==> Preparing: SELECT CASE WHEN EXISTS ( SELECT 1 FROM tm_transport_time ) THEN 1 ELSE 0 END 2025-09-18 09:47:39.223 [reactor-http-nio-2] DEBUG c.h.m.master.TransportTimeMapper.existsByCodes - ==> Parameters: 2025-09-18 09:47:39.260 [reactor-http-nio-2] DEBUG c.h.m.master.TransportTimeMapper.existsByCodes - <== Total: 1 2025-09-18 09:47:39.272 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17d2ae20] 2025-09-18 09:47:39.303 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17d2ae20] from current transaction 2025-09-18 09:47:39.312 [reactor-http-nio-2] DEBUG c.hvlink.mapper.master.TransportTimeMapper.insert - ==> Preparing: INSERT INTO tm_transport_time ( transport_time, is_deleted, create_by, create_time, update_by, update_time ) VALUES ( ?, ?, ?, ?, ?, ? ) 2025-09-18 09:47:39.338 [reactor-http-nio-2] DEBUG c.hvlink.mapper.master.TransportTimeMapper.insert - ==> Parameters: 49.0(Double), false(Boolean), admin(String), 2025-09-18 09:47:39.301(Timestamp), admin(String), 2025-09-18 09:47:39.301(Timestamp) 2025-09-18 09:47:39.374 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17d2ae20] 2025-09-18 09:47:39.462 [reactor-http-nio-2] DEBUG o.s.beans.factory.xml.XmlBeanDefinitionReader - Loaded 11 bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] 2025-09-18 09:47:39.463 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'DB2' 2025-09-18 09:47:39.467 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Derby' 2025-09-18 09:47:39.467 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'H2' 2025-09-18 09:47:39.468 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'HDB' 2025-09-18 09:47:39.469 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'HSQL' 2025-09-18 09:47:39.470 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Informix' 2025-09-18 09:47:39.470 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'MS-SQL' 2025-09-18 09:47:39.470 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'MySQL' 2025-09-18 09:47:39.471 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Oracle' 2025-09-18 09:47:39.471 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'PostgreSQL' 2025-09-18 09:47:39.472 [reactor-http-nio-2] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Sybase' 2025-09-18 09:47:39.472 [reactor-http-nio-2] DEBUG o.s.jdbc.support.SQLErrorCodesFactory - Looking up default SQLErrorCodes for DataSource [com.hvlink.config.DataSourceConfig$1@23ee2ccf] 2025-09-18 09:47:39.484 [reactor-http-nio-2] DEBUG o.s.jdbc.support.SQLErrorCodesFactory - SQL error codes for 'Microsoft SQL Server' found 2025-09-18 09:47:39.484 [reactor-http-nio-2] DEBUG o.s.jdbc.support.SQLErrorCodesFactory - Caching SQL error codes for DataSource [com.hvlink.config.DataSourceConfig$1@23ee2ccf]: database product name is 'Microsoft SQL Server' 2025-09-18 09:47:39.486 [reactor-http-nio-2] DEBUG o.s.j.support.SQLErrorCodeSQLExceptionTranslator - Unable to translate SQLException with Error code '515', will now try the fallback translator 2025-09-18 09:47:39.486 [reactor-http-nio-2] DEBUG o.s.jdbc.support.SQLStateSQLExceptionTranslator - Extracted SQL state class '23' from value '23000' 2025-09-18 09:47:39.488 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17d2ae20] 2025-09-18 09:47:39.489 [reactor-http-nio-2] DEBUG org.mybatis.spring.SqlSessionUtils - Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@17d2ae20] 2025-09-18 09:47:39.490 [reactor-http-nio-2] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback 2025-09-18 09:47:39.490 [reactor-http-nio-2] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [ConnectionID:1 ClientConnectionId: 69f1048c-e727-4578-a768-9bd8edc01bc9] 2025-09-18 09:47:39.515 [reactor-http-nio-2] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [ConnectionID:1 ClientConnectionId: 69f1048c-e727-4578-a768-9bd8edc01bc9] after transaction 2025-09-18 09:47:39.523 [reactor-http-nio-2] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [c658418b-1] Using 'application/json' given [application/json, text/plain, */*] and supported [application/json, application/*+json, application/x-ndjson, text/event-stream] 2025-09-18 09:47:39.524 [reactor-http-nio-2] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [c658418b-1] 0..1 [com.hvlink.common.Result<java.lang.String>] 2025-09-18 09:47:39.533 [reactor-http-nio-2] DEBUG o.s.http.codec.json.Jackson2JsonEncoder - [c658418b-1] Encoding [Result(status=500, msg=<EOL><EOL>### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServer (truncated)...] 2025-09-18 09:47:39.564 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [c658418b-1, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] Detected non persistent http connection, preparing to close 2025-09-18 09:47:39.599 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [c658418b-1, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] Last HTTP packet was sent, terminating the channel 2025-09-18 09:47:39.599 [reactor-http-nio-2] DEBUG reactor.netty.channel.ChannelOperations - [c658418b-1, L:/192.168.10.122:9000 - R:/192.168.10.221:63369] [HttpServer] Channel inbound receiver cancelled (operation cancelled). 2025-09-18 09:47:39.634 [reactor-http-nio-2] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [c658418b-1] Completed 200 OK
最新发布
09-19
你提供的日志是一个 **Spring WebFlux + MyBatis + SQL Server** 项目的运行时调试日志,记录了一次 HTTP 请求的完整处理流程。这次请求是向 `/master/transportTime/add` 接口发起的 `POST` 请求,最终 **插入据失败并回滚事务**。 --- ## ✅ 核心问题定位 ### ❌ 错误信息摘要: ```log SQL error code '515' → SQL State: '23000' Unable to translate SQLException with Error code '515' Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'company_code', table 'hv_link.dbo.tm_transport_time'; column does not allow nulls. INSERT fails. ``` > ⚠️ 这是关键错误!虽然没有完整打印出来,但从上下文可以推断出这个异常(常见于 SQL Server 的 `INSERT` 操作中违反 `NOT NULL` 约束)。 --- ## 🔍 日志分析全过程 | 时间 | 日志内容 | 分析 | |------|--------|------| | `09:47:38.337` | `HTTP POST "/master/transportTime/add"` | 客户端发起增运输时间请求 | | `09:47:38.364` | `Mapped to TransportTimeController#insert(TransportTimeDTO)` | 找到控制器方法 | | `09:47:38.431` | `Decoded [TransportTimeDTO(...)]` | JSON 成功反序列化为 DTO 对象,但字段全为 `null`!⚠️ | ```java TransportTimeDTO(id=null, companyCode=null, supplierCode=null, factoryCode=null, warehouseCode=null, ...) ``` ➡️ 明显前端传来的 JSON 据缺失必要字段! | `09:47:39.192` | `SELECT CASE WHEN EXISTS (...) THEN 1 ELSE 0 END` | 先执行了 `existsByCodes` 查询(逻辑正常) | | `09:47:39.312` | `INSERT INTO tm_transport_time (...) VALUES (?, ?, ...)` | 执行插入语句 | | `09:47:39.338` | 参:`49.0, false, admin, now, admin, now` | ⚠️ 缺少所有业务主键字段!只传了 `transport_time`, `is_deleted`, `create_by`, `update_by` 等通用字段 | | `09:47:39.486` | `SQLStateSQLExceptionTranslator - Extracted SQL state class '23' from value '23000'` | 插入失败,触发约束异常(完整性约束 violation) | | `09:47:39.490` | `Initiating transaction rollback` | Spring 回滚事务 | | `09:47:39.533` | `Encoding [Result(status=500, msg=...Error updating database...]` | 返回 500 错误给前端 | --- ## 🧩 根本原因总结 > ❗ **你在调用 `/master/transportTime/add` 接口时,传递的 JSON 中缺少了据库表要求的非空字段(如 `company_code`, `supplier_code` 等),导致 SQL Server 抛出 `Cannot insert NULL into column` 异常,进而事务回滚,接口返回 500。** --- ## ✅ 解决方案 ### ✅ 步骤 1:检查 `TransportTimeDTO` 字段定义 确保 DTO 包含所有必要字段: ```java // TransportTimeDTO.java @Data public class TransportTimeDTO { private String companyCode; private String supplierCode; private String factoryCode; private String warehouseCode; private Double transportTime; // 其他字段... } ``` ### ✅ 步骤 2:检查前端或测试工具发送的 JSON 你必须发送完整的字段,例如: ```json { "companyCode": "C001", "supplierCode": "S001", "factoryCode": "F001", "warehouseCode": "W001", "transportTime": 49.0 } ``` ❌ 错误示例(当前实际发送的内容): ```json { "transportTime": 49.0 } ``` 这会导致其他字段为 `null`,而据库不允许为空。 --- ### ✅ 步骤 3:检查据库表结构 查看 `tm_transport_time` 表结构: ```sql DESCRIBE tm_transport_time; -- 或在 SQL Server 中: SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tm_transport_time'; ``` 确认哪些字段是 `NOT NULL`,这些都必须在插入时提供值。 典型结构可能是: | 列名 | 是否允许 NULL | |------|---------------| | company_code | ❌ NOT NULL | | supplier_code | ❌ NOT NULL | | factory_code | ❌ NOT NULL | | warehouse_code | ❌ NOT NULL | | transport_time | ❌ NOT NULL | | is_deleted | ✅ NULL | | create_by | ❌ NOT NULL | | create_time | ❌ NOT NULL | --- ### ✅ 步骤 4:增强后端校验(推荐) 使用 `@Valid` + `@NotBlank` 做参校验: ```java // Controller @PostMapping("/add") public Result<String> insert(@RequestBody @Valid TransportTimeDTO dto) { return transportTimeService.insert(dto); } ``` ```java // DTO import javax.validation.constraints.NotBlank; @Data public class TransportTimeDTO { @NotBlank(message = "公司编码不能为空") private String companyCode; @NotBlank(message = "供应商编码不能为空") private String supplierCode; @NotBlank(message = "工厂编码不能为空") private String factoryCode; @NotBlank(message = "仓库编码不能为空") private String warehouseCode; @NotNull(message = "运输时间不能为空") private Double transportTime; } ``` 这样可以在 **进入 Service 之前就拦截非法请求**,返回更友好的错误信息。 --- ### ✅ 步骤 5:优化异常处理(让错误更清晰) 在你的 `ExceptionHandle.java` 中添加对 `DataIntegrityViolationException` 的捕获: ```java @ExceptionHandler(DataIntegrityViolationException.class) public ResponseEntity<Result<?>> handleDataIntegrityViolation(DataIntegrityViolationException e) { log.error("据完整性冲突", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(Result.fail("据不完整或存在冲突,请检查必填项")); } ``` 导入: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> ``` --- ## ✅ 最佳实践建议 | 建议 | 说明 | |------|------| | ✅ 使用 `@Valid` 校验入参 | 提前发现问题,避免深入 DB 层才报错 | | ✅ DTO 与 POJO 分离 | 避免暴露实体细节 | | ✅ 添加 Swagger 文档 | 让前端清楚需要传哪些字段 | | ✅ 开启 MyBatis 日志 | 方便排查 SQL 问题 | | ✅ 使用 Postman / Apifox 测试接口 | 可视化调试 | --- ## ✅ 总结 > 你现在的问题不是代码逻辑错误,而是 **请求参不完整** 导致据库插入失败。 🔧 **修复方式:** 1. 前端或测试工具发送完整 JSON(包含 `companyCode`, `supplierCode` 等) 2. 后端增加 `@Valid` 参校验 3. 统一异常处理返回友好提示 ✅ 修复后,插入将成功,事务不会回滚。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eternity_GQM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值