nullnull2013金山西山居创意游戏程序挑战赛——初赛(3)生日猜猜猜

本文介绍了一个日期转换的算法实现,该算法将特定条件下的日期转换为分数形式,并通过实例演示了如何判断闰年及计算最大公约数。此外,还提供了一段C++代码示例,用于展示整个算法的具体实现。

题记:写这篇博客要主是加深自己对nullnull的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。

    这道题是水题。

    

    每日一道理
因为自信,在呀呀学语时,我靠着纤嫩的双腿,迈出人生的第一步;因为自信,我一次次将第一名的奖状高高举起;因为自信,我毫不吝惜地剪掉飘逸的长发,在运动场上展现风采……感谢自信,它给了我一双翅膀,让我在电闪雷鸣中去飞翔,在风雨中去搏击人生!
#include<iostream>
using namespace std;

int leapYear(int n){
    if(((n % 4 == 0)&&(n % 100))||(n % 400 == 0))
           return 1;
    return 0;
}

int gcd(int a,int b){
     int r;
     while(a%b)
    {
         r=a%b;
         a=b;
         b=r;
    }
    return  b;
}

int main(){
    int t,x,y,z;
    int index_x,index_y;
    int i,j,k,count,tmp=1;
    cin>>t;
    while(t--){
          int g;
          cin>>x>>y>>z;
          cout<<"Case #"<<tmp++<<": ";
          count=0;
          
          for(i=1;i<=12;i++){
              if(i==1||i==3||i==5||i==7||i==8||i==10||i==12){
                     k=31;
              }
              else if(i==4||i==6||i==9||i==11){
                     k=30;
              }
              else{
                     leapYear(z)?k=29:k=28;  
              }
               for(j=1;j<=k;j++){
                    g=i>j?gcd(i,j):gcd(j,i);             
                    if(x==g&&y==i*j/g){
                         index_y=i;
                         index_x=j;
                         count++;                     
                         }               
               }        
          }
         if(count==0)
             cout<<"-1"<<endl;
         else if(count==1)
             printf("%d/%02d/%02d\n",z,index_y,index_x);
         else
             cout<<"1"<<endl;    
    }
    return 0;
}

文章结束给大家分享下程序员的一些笑话语录: AdobeFlash拖垮Windows拖垮IE!又拖垮Linux拖垮Ubuntu拖垮FirxEox!还拖垮BSD拖垮MacOS拖垮Safri!简直无所不拖!AdobeFlash滚出网路世界!不要以为市占有率高就可以持续出烂货产品!以后替代品多得是!

2025-03-31 16:20:33.220 [http-nio-8080-exec-2] ERROR com.gentlesoft.persistence.mybatis.MybatisGenericDao 105 insert admin - SQL:SQLID:com.gentlesoft.qmcyzd.domain.CyzdItem.insert; #### SQL:insert into QMCYZD_ITEM (ID,NO,ITEMTYPE,SUBJECTITEM,REGARDINGREQUIREMENTS,COMPLETEDEADLINE,REPORTLEADER,PERFORMANCESUBJECT,AUDITDEPT,NODES,FIRSTREMINDER,SECONDREMINDER,CONTENT,EXT1,EXT2,EXT3,EXT4,EXT5,EXT6,EXT7,EXT8,EXT9,EXT10) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?); #### parameters:s5VLJ9Vk6DNNvjfDZX2,543,null,435345,3453,2025-03-19,null,{CsybD3WgO3nkH5uanml,RCmI8tQ6PM7iAV2A2ze,Y0veGgwX634To6PdOIp},{CsybD3WgO3nkH5uanml,RCmI8tQ6PM7iAV2A2ze,Y0veGgwX634To6PdOIp,dh7KM5XqqGEguk0iVkE,ka5ZJtP4Y4FmX4Xilwu,j4o79ikVGKJxCxcKfcz},2025-04-02,5,7,null,null,null,null,null,null,null,null,null,nullnull 三月 31, 2025 4:20:33 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet [dispatcher] in context with path [/gentleoa] threw exception [Request processing failed; nested exception is com.gentlesoft.persistence.mybatis.SQLExecuteException: org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: com.highgo.jdbc.util.PSQLException: ERROR: 22001: value too long for type character varying(50) ### The error may involve com.gentlesoft.qmcyzd.domain.CyzdItem.insert-Inline ### The error occurred while setting parameters ### SQL: insert into QMCYZD_ITEM (ID,NO,ITEMTYPE,SUBJECTITEM,REGARDINGREQUIREMENTS,COMPLETEDEADLINE,REPORTLEADER,PERFORMANCESUBJECT,AUDITDEPT,NODES,FIRSTREMINDER,SECONDREMINDER,CONTENT,EXT1,EXT2,EXT3,EXT4,EXT5,EXT6,EXT7,EXT8,EXT9,EXT10) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ### Cause: com.highgo.jdbc.util.PSQLException: ERROR: 22001: value too long for type character varying(50)
04-01
<think>好的,我现在需要帮用户分析这个SQL插入错误。首先,用户提供的日志显示了一个数据库错误:value too long for type character varying(50)。这说明某个字段的值长度超过了数据库中定义的varchar(50)限制。 首先,我要理清错误信息中的关键部分。错误发生在执行插入语句到表QMCYZD_ITEM时。日志中的SQL语句和参数列表需要仔细查看,特别是参数部分,看看哪些字段可能超长。 用户提供的参数列表里,参数值有些是数组,比如PERFORMANCESUBJECT和AUDITDEPT的值被大括号包围,看起来像是多个值组成的列表。但数据库字段如果是varchar(50),这样的结构可能无法存储,或者其中某个元素的长度超过了50字符。 接下来,我需要检查插入的每个字段对应的参数值长度。例如,ID是s5VLJ9Vk6DNNvjfDZX2,这个长度是20字符,没问题。NO是543,显然没问题。ITEMTYPE是null,没问题。SUBJECTITEM是435345,数值没问题。REGARDINGREQUIREMENTS是3453,没问题。COMPLETEDEADLINE是2025-03-19,日期格式,没问题。REPORTLEADER是null,没问题。 问题可能出在PERFORMANCESUBJECT和AUDITDEPT这两个字段。它们的参数值看起来像是由逗号分隔的多个字符串,例如{CsybD3WgO3nkH5uanml,RCmI8tQ6PM7iAV2A2ze,Y0veGgwX634To6PdOIp}。每个字符串的长度需要检查,比如第一个字符串CsybD3WgO3nkH5uanml,数一下字符数,是24个字符,没问题。但可能其他字段中的某个值超过50字符。比如AUDITDEPT里的某个元素,如ka5ZJtP4Y4FmX4Xilwu,数一下字符,是20个,没问题。但用户提供的参数最后有一个nullnull,这可能是个问题,可能EXT10字段被传入了nullnull,而如果EXT10是varchar(50)nullnull是6字符,没问题,但或许其他地方有误。 不过,根据错误信息,明确是某个字段的值超过varchar(50)。可能用户省略了部分参数,或者我数错了某个字符串的长度。比如,可能AUDITDEPT中的某个值,比如j4o79ikVGKJxCxcKfcz,数一下,是20字符,还是没问题。那是否有其他字段? 再仔细看参数列表,最后的EXT字段都是null,除了最后一个是nullnull。可能EXT10字段被错误地写成了nullnull,而数据库里该字段是varchar(50),但nullnull只有8字符,应该没问题。那可能还有其他字段? 或者,问题出在字段映射上。例如,原本应该插入到某个字段的参数被错误地放到了另一个更短的字段里。例如,如果PERFORMANCESUBJECT对应的字段是varchar(50),但参数中的某个值超过了这个长度。比如,假设其中一个值是Y0veGgwX634To6PdOIp,这个长度是24,没问题。但可能实际参数中存在更长的字符串? 或者,参数中的某些字段在传递时被错误处理,例如数组被直接转换为字符串,导致整个字符串过长。例如,PERFORMANCESUBJECT字段可能设计为存储单个字符串,但实际传入了数组形式,导致整个数组字符串的长度超过50。例如,整个{CsybD3WgO3nkH5uanml,RCmI8tQ6PM7iAV2A2ze,Y0veGgwX634To6PdOIp}的长度是多个字符串加逗号和花括号的长度。例如,每个ID大约24字符,三个的话就是24*3 + 2逗号 + 2括号,总长度可能超过50。比如24*3=72,加上符号,总长度可能在74左右,这样就会超过varchar(50)的限制。这时候,错误就会发生在这里。 因此,可能的问题是PERFORMANCESUBJECT或AUDITDEPT字段试图存储一个由多个值拼接而成的字符串,而整个拼接后的字符串长度超过了50个字符。例如,PERFORMANCESUBJECT的值被大括号包围,里面有三个ID,每个24字符,总长度超过50,导致该字段的插入值过长。 另外,检查SQL语句中的字段和参数的位置是否对应正确。例如,参数列表中的每个值是否按顺序对应到正确的字段。例如,如果参数顺序错位,可能导致长字符串被插入到本应是较短字段的位置。 此外,用户提供的参数中,最后的EXT10对应的参数是nullnull,可能应该是单独的null,但写成了nullnull,这可能导致该字段被填入字符串"nullnull",长度8,不超过50,所以可能不是问题所在。 综上,最可能的原因是PERFORMANCESUBJECT或AUDITDEPT字段的拼接值超过了50字符的限制。需要检查这两个字段的数据库定义,确认其类型是否为varchar(50),并检查传入的值长度。例如,将多个ID拼接存储到一个字段中,导致总长度超限。 解决方案建议用户检查这两个字段的值,确保每个传入的字符串不超过50字符,或者修改数据库表结构,增加字段长度,例如改为varchar(100)或更大的类型。另外,检查代码中是否有错误的参数拼接或赋值,确保每个参数对应正确的字段,并且值长度符合定义。</think>### 问题分析 根据日志信息,该错误是由于插入数据时**字段值长度超过数据库定义的`varchar(50)`类型限制**导致的。以下是逐步分析: --- #### 1. **错误类型定位** 错误信息明确提示: `ERROR: 22001: value too long for type character varying(50)` 说明**某个字段的值长度超过50字符**,与数据库表定义冲突。 --- #### 2. **SQL语句与参数对照** 插入语句字段与参数对应关系如下(简化分析关键字段): | 字段 | 参数值示例 | 潜在问题分析 | |----------------------|-------------------------------|------------------------------| | `PERFORMANCESUBJECT` | `{CsybD3WgO3nkH5uanml,...}` | 大括号内拼接的字符串可能超长 | | `AUDITDEPT` | `{CsybD3WgO3nkH5uanml,...}` | 同上 | | `EXT10` | `nullnull` | 可能误写为字符串"nullnull" | --- #### 3. **关键问题点** - **字段值拼接超长** 例如,`PERFORMANCESUBJECT`或`AUDITDEPT`字段的参数值格式为`{value1,value2,...}`,实际存储时若以字符串形式拼接,总长度可能超过50字符。 - **参数值异常** 末尾的`EXT10`字段参数值为`nullnull`,可能应为`null`,但被误写为字符串"nullnull"(长度8,未超限,但需检查代码逻辑)。 --- ### 解决方案 #### 1. **验证字段值长度** 检查以下字段参数值的**实际字符串长度**是否超过50字符: - `PERFORMANCESUBJECT` - `AUDITDEPT` - `EXT1`至`EXT10` --- #### 2. **修正字段定义** 若需存储长文本,修改表结构,例如: ```sql ALTER TABLE QMCYZD_ITEM ALTER COLUMN PERFORMANCESUBJECT TYPE varchar(100); ``` --- #### 3. **检查参数传递逻辑** - **代码层**:确认参数是否为数组类型(如`List<String>`),但被错误拼接为字符串。 - **MyBatis映射**:检查是否因动态SQL拼接导致字段值意外超长。 --- #### 4. **日志中的参数问题** - **`EXT10`字段值**:参数末尾的`nullnull`应为`null`,需检查代码是否误将字符串"null"写入。 --- ### 总结 **根本原因**是字段值长度与数据库定义不匹配。需通过以下步骤修复: 1. 检查参数值的实际长度。 2. 调整表字段类型或代码逻辑。 3. 确保参数传递正确性(如`null`与字符串的区分)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值