java POI Execel表格的统一校验与导入

用POI做excel导入功能,各种校验控制 背景:导入功能 图示: excel:模板 功能简述: 根据文件地址,获取文件,解析校验表单(标题行,数据行各种校验),存入数据,返回异常数据错误信息(错误位置,错误原因) 本文重点(表单的校验) 1.标题行 1.1 非空,字符串校验 1.2 名称校验(如;票据号码) 1.3 顺序校验(防止客户误操作移动列,导致数据插入进db的非对应字段) 2. 数据行各种校验) 2.1 非空,数据格式校验(字符串,数字,日期等) 2.2 长度校验(恒等的长度,以及最大的长度) 2.3 数据合理性校验(金额范围,出票日期 阅读详情

一、前言

最近公司项目有很多地方需要导入execel文件,之前用的那个没有对execel导入做统一的处理,是针对每一个execel表格分别处理的,这样处理起来很麻烦,每次都要写很多的逻辑代码,而且还没有对execel表格的内容做约束,这样很可能出现问题。所以,有必要对execel表格文件做统一的处理,而不是针对某一个execel文件。

二、设计概述

对execel表格数据的校验采用Hibernate Validator这个组件,这个校验器很强大,具体有什么功能请参考官方文档;由于数据的内容、格式每次都是变化的,故针对每一行数据需要动态地把它封装成一个对象,这时候就需要用到动态语言,我用的是Spring EL语言,这个特性是Spring3.0 采用的,很强大,具体的可参考官方文档。

三、实现步骤

1、找数据范围

execel表格的数据范围很灵活,不用限定在某行、某列,我们假设execel表格的数据是集中的,也即集中在某一个矩形区域,我们只需要扫描每一行每一列,找到数据开始的单元格,它左边、下面就都是数据内容了。

2、封装成字符串

execel的单元格格式很不统一,我们需要把每一个单元格的数据内容都解析成字符串,然后以一行为单位,封装成字符串数字,再把数据送到需要装载的Bean,让它自己去封装。

四、实现考虑

如果表格数据太多,一次性就把数据都解析完了,这样可能会使系统崩溃了,所有,我的做法是每解析一行数据,就把它插入数据库,这样,再多的数据也不会有问题。

校验的时候,需要写个配置文件,这个配置文件说明了需要导入的表格的内容以及各式,以免非法导入。

五、代码

1、需要引入的包(我只是大概说一下,可能会有遗漏)   

     解析xml用到的包 dom4j

     解析execel用到的包  poi相关包

     动态解析用到的包  Spring EL

代码结构

一个异常类、一个校验数据转换类、一个主类、一个配置文件、以及相关测试类。

最主要是一个用来解析Execel的类,另外一个需要校验的类

package test.bean;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

import com.dcrx.execelimport.ValidationExeception;

public class Warehouse {
	@NotEmpty
	private String warehouseId;
	@Length(min = 2, max = 16)
	private String warehouseName;
	private int id;
	//@Range(min=2,max=2)
	@NotEmpty
	@Pattern(regexp = "[12]")
	private String type = "1"; // 1-自有,2-代储
	private int status = 0; // 0-正常,1-删除
	private String companyId = "";
	private Date date;
	@DecimalMin("0.1")
	private double dou;
	private float flo;
	private boolean boo;
	
	DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // 针对日期的默认转换形式

	public void assertEquals(String[] values,int size) throws ValidationExeception{
		if(values.length != size)
			throw new ValidationExeception("配置文件提供"+values.length+"个字段"+",而导入数据库需要提供"+size+"个字段");
	}
	public String getIntString(String val){
		if(val.equals(""))
			return "";
		else{
			double d = Double.valueOf(val);
			Integer i = (int)d;
			return  i.toString();
		}
	}
	public int getInt(String val){
		return val.equals("")?0:Integer.valueOf(getIntString(val));
	}
	public float getFloat(String val){
		return val.equals("")?0.0f:Float.valueOf(val);
	}
	public double getDouble(String val){
		return val.equals("")?0.0:Double.valueOf(val);
	}
	public Date getDate(String val) throws ParseException{
		return  val.equals("") ? new Date() : format.parse(val);
	}
	public void setValues(String[] values) throws Exception{
            assertEquals(values,7);
			this.warehouseId = values[0];
			this.warehouseName = values[1];
			this.type = getIntString(values[2]);		
			this.date = values[3].equals("") ? new Date() : format.parse(values[3]);
			this.dou = values[4].equals("") ? 0.0 : Double.valueOf(values[4]);
			this.flo = values[5].equals("") ? 0.0f : Float.valueOf(values[5]);
			this.boo = values[6].equals("") ? false : Boolean.valueOf(values[6]);
	}

	public boolean isBoo() {
		return boo;
	}

	public void setBoo(boolean boo) {
		this.boo = boo;
	}

	public String getWarehouseId() {
		return warehouseId;
	}

	public void setWarehouseId(String warehouseId) {
		this.warehouseId = warehouseId;
	}

	public String getWarehouseName() {
		return warehouseName;
	}

	public void setWarehouseName(String warehouseName) {
		this.warehouseName = warehouseName;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public String getCompanyId() {
		return companyId;
	}

	public void setCompanyId(String companyId) {
		this.companyId = companyId;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public double getDou() {
		return dou;
	}

	public void setDou(double dou) {
		this.dou = dou;
	}

	public float getFlo() {
		return flo;
	}

	public void setFlo(float flo) {
		this.flo = flo;
	}

}

以上是一个实体类,具体的校验规则是用到了Hibernate Validator 的语法

下面是主类

package com.dcrx.execelimport;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.expression.EvaluationException;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;

/**
 * @Desc 对execel文件的校验并且解析
 * @author jackshen
 * 
 */
@SuppressWarnings("rawtypes")
public class ExecelUtil {
	Logger logger = Logger.getLogger(this.getClass());

	private String description = "";// 如果校验失败,将会给出详细提示信息
	private Sheet sheet;// execel 对象
    private List<String> fieldList;//从xml读取到的execel表格信息
    private int rowIndex = 0;//当前操作行
    private Object objectBean;//每一行数据封装 
    private Cell cellStart;// 数据的开始单元格
    private Class clazz; //需要封装的类
    private Validator validator; //hibernate 的校验器
    private String[] fieldVals ; //从execel读到的某一行的数据
    private int fieldSize = 0;  //有效数据的列数
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // 针对日期的默认转换形式
    private Expression exp ;//EL 解析器
    private ExpressionParser parser;
	public String getDescription() {
		return description;
	}

	public Object getObjectBean() {
		return objectBean;
	}
	/**
	 * 
	 * @param execelFilename
	 *            execel文件名
	 * @param xmlFilename
	 *            execel文件所对应的校验文件
	 * @param calzz 需要封装的类
	 */
	public ExecelUtil(InputStream execelIS,String xmlFilename,Class clazz) throws ValidationExeception{
		// 打开execel工作簿
		Workbook wb = null;
		try {
			wb = new HSSFWorkbook(execelIS);
		} catch (IOException e) {
			logger.error(e);
			throw new ValidationExeception("","加载文件失败,请确保是否是Execel表格");
		}		
		sheet = wb.getSheetAt(0);// 默认取第一个工作簿
		//读配置文件,获取所有的属性列描述
        fieldList = this.readFieldsFromXML(getAbsolutePath(xmlFilename));
        //个数
        fieldSize = fieldList.size();
        
		//找到有效数据的开始单元格
		cellStart = this.findStartCell();
		if(cellStart == null){			
			throw new ValidationExeception("",this.description);
		}
		
		//每次读取一行execel数据,rowIndex每次增1
		rowIndex = cellStart.getRowIndex()+1;
		
		//需要封装的对象类
		this.clazz = clazz;
		//初始化校验器
		ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
		validator = factory.getValidator();
		//初始化EL解析器
		parser = new SpelExpressionParser();
		exp = parser.parseExpression("values");
	}
	//是否还有数据
    public boolean hasNext(){
    	Row row = sheet.getRow(rowIndex++);
    	if(row == null)
    		return false;
    	fieldVals = this.getRowValues(row, cellStart.getColumnIndex());
        if(Arrays.asList(fieldVals).indexOf("") != -1){
        	for(String s :fieldVals)//如果每个字段都是空的,则返回false 否则true
        		if(!s.equals(""))
        			return true;
        	return false;
        }
    	return true;
    }
    //校验
    public boolean validate(){
        try {
        	objectBean = Class.forName(clazz.getName()).newInstance();
		} catch (Exception e) {
			logger.error(e);
		}
		
		try{
		    exp.setValue(objectBean, fieldVals);// 给objectBean的属性赋值
		}catch(EvaluationException e){//由于所有的数据类型转换都有objectBean里面来处理,故可能有异常,需要进行相应的处理
			List exList = Arrays.asList("ParseException","NumberFormatException");//一般可能发生的异常
			Throwable t = e.getCause();
			while(t!=null){
				String causeClazz = t.getClass().getSimpleName();
				if(exList.contains(causeClazz)){
                       this.description = "第" +rowIndex+"行,类型转换失败:"+t.getMessage();
                       return false;
				}else if(causeClazz.equals("ValidationExeception")){//自定义异常
					this.description = "第" +rowIndex+"行,"+t.getMessage();
					return false;
				}else
					t = t.getCause();
			}			 
			this.description = parser.parseExpression("message").getValue(objectBean,String.class);
			return false;
		}
		//校验,校验规则是配置在objectBean对象里面
		Set<ConstraintViolation<Object>> constraintViolations = validator.validate(objectBean);
		if(constraintViolations.size() >0){//校验失败时,提示相应信息
			for (ConstraintViolation<Object> vl : constraintViolations) {
				this.description = "第" +rowIndex+"行,校验出错:"+ vl.getPropertyPath() + "=" + vl.getInvalidValue() + ":" + vl.getMessage();			
				return false;
			}			
		}
		return true;
    }
    private String[] getRowValues(Row row,int columnStartIndex){
        String[] values = new String[fieldSize];
    	for(int j = columnStartIndex,t=0;t<fieldSize;j++,t++){
    		Cell c = row.getCell(j);
    		if(c==null){
    			values[t] = "";
    			continue;
    		}
    		switch(c.getCellType()){
    		case Cell.CELL_TYPE_BLANK:
    			values[t] = "";
    			break;
    		case Cell.CELL_TYPE_BOOLEAN:
    			values[t] = String.valueOf(c.getBooleanCellValue());
    			break;
    		case Cell.CELL_TYPE_NUMERIC:
				if (HSSFDateUtil.isCellDateFormatted(c))
					values[t] = format.format(c.getDateCellValue());
				else 
					values[t] = String.valueOf(c.getNumericCellValue());
    			break;
    		case Cell.CELL_TYPE_STRING:
    			values[t] = String.valueOf(c.getStringCellValue());
    			break;
    		default:
    			values[t] = "";
    			break;
    		}
    	}
    	return values;
    }
	// 根据某一个单元格,得到更人性化的显示,例如“A4”
	private String getCellRef(Cell cell) {
		return CellReference.convertNumToColString(cell.getColumnIndex()) + (cell.getRowIndex() + 1);
	}
	private  String getAbsolutePath(String file) throws ValidationExeception {
		try {
			file = this.getClass().getClassLoader().getResource(file).getFile();

		} catch (NullPointerException e) {
			throw new ValidationExeception(file, "文件不存在");
		}
		try {
			// 解决当出现中文路径时不能解析的bug
			file = URLDecoder.decode(file, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			throw new ValidationExeception(file, "解码失败");
		}
		return file;
	}
	private List<String> readFieldsFromXML(String xmlFilename)throws ValidationExeception{
		SAXReader reader = new SAXReader();
		Document document = null;
		
		try {
			document = reader.read(new File(xmlFilename));// 加载配置文件
		} catch (DocumentException e) {
			e.printStackTrace();
			this.description = "IO 异常,读取配置文件失败";
			throw new ValidationExeception(xmlFilename,"IO 异常,读取配置文件失败");
		}
		
		Element root = document.getRootElement();
		List<String> fields = new ArrayList<String>();
		for (Iterator iter = root.elementIterator("field"); iter.hasNext();) {
			Element field = (Element) iter.next();
            fields.add(field.getTextTrim());
		}
		
		return fields;
	}
	/**
	 * 从execel表中找到数据开始的单元格
	 * @return
	 */
	private  Cell findStartCell(){
		String firstFieldDesc = this.fieldList.get(0);
		int endRow = sheet.getLastRowNum()>100?100:sheet.getLastRowNum();
		for(int i = 0;i<=endRow;i++){
			Row r = sheet.getRow(i);
			if (r == null)
				continue;
			for(int j = 0;j < r.getLastCellNum();j++){
				Cell c = r.getCell(j);
				if( c == null)
					continue;
				if(c.getCellType() == Cell.CELL_TYPE_STRING){
					if(c.getStringCellValue().trim().equals(firstFieldDesc)){//找到第一个符合要求的字段,接下来判断它相邻的字段是否都符合要求
                        if(fieldList.size()>r.getLastCellNum()-j){
                        	this.description = "execel表格与所给配置描述不符,请下载模板文件";
                        	return null;
                        }
						for(int k=j+1,t=1;k<=j+fieldList.size()-1;k++,t++){
							Cell c2 = r.getCell(k);
							if(c2 == null){
								this.description = "请确保单元格"+this.getCellRef(c2)+"内容是\""+fieldList.get(t)+"\"";
								return null;
							}
							if(c2.getCellType() == Cell.CELL_TYPE_STRING){
								if(c2.getStringCellValue().contains(fieldList.get(t)))
									continue;
								else{
										this.description = "请确保单元格"+this.getCellRef(c2)+"内容是\""+fieldList.get(t)+"\"";
										return null;	
								}
							}
							 
						}
						return c;
					}else
						continue;
				}else
					continue;
			}
		}
		this.description = "找不到\""+fieldList.get(0)+"\"这一列";
		return null;
	}
}

附件有一个完整的Demo,只需要引入相应的包就能跑。

http://download.youkuaiyun.com/detail/jackshen310/4472852


java导入excel接口校验excel版本是否匹配 在业务开发中,一个功能有三四个版本的时候,对应的excel导入模板也是不同的,这个时候对于不同的导入接口就需要进行excel导入模板的校验。校验当前接口对应的dto字段列是否与当前excel对应的表头是否匹配。 阅读详情

相关推荐

PTA——百鸡问题扩展-N鸡问题

百鸡问题扩展-N鸡问题 N元钱买N只鸡,公鸡每只5元,母鸡每只3元,小鸡1元3只,N元钱必须刚好买N只鸡,而且鸡必须整只买,不能劈开买。 有几种买法呢?这就是N鸡问题。 输入格式: 在一行中输入一个正整数N。(N<500) 输出格式: 在一行中输出两个整数c s,中间用一个空格隔开,表示N元钱买N只鸡共有 c 种买法,且所有买法的公鸡数量之和是 s。 如果无解,则 s 为 -1. 输入样例1: 100 输出样例1: 4 24 输入样例2: 1 输出样例2: 0 -1 #include<i

senmu_的博客 2625

JAVA工具类——Excel的读取和校验

JAVA工具类——Excel的读取和校验

M_Love_U的博客 6547

java 利用POI对Execel表格的统一导入与校验(利用Hibernate Validator)

利用 POI统一对Execel表格文件的导入与校验,统一封装,以后勿需自己写逻辑代码,所有的都是可配置的。

利用java反射机制,在导入时校验表头是否一致

因为最近都是开发的都是管理页面,碰到了很多个需要校验表头是否一致的需求,所以在此记录一下。

weixin_48788601的博客 1339

Hi3559AV100制作ext4文件系统和烧录emmc

1、首先生成所需文件系统,见本博客&lt;Hi3559AV100文件系统制作cramfs&gt;。 2、使用工具生成EXT4文件系统 ./make_ext4fs -s -l 96M rootfs_hi3559av100.ext4 ./rootfs 3、烧录文件系统 mw.b 0x82000000 ff 0x12C00000;tftp 0x82000000 STM_...

阿Sir问道 7035

从零构建:如何在VSCode中为HBuilderX迁移的UniApp项目搭建TypeScript支持环境

本文详细指导如何将HBuilderX中的UniApp项目迁移至VSCode并搭建TypeScript支持环境。通过pnpm包管理器初始化项目、配置tsconfig.json和vite.config.ts文件,实现工程化迁移与TypeScript深度集成,提升开发效率和代码质量。

book8的博客 1051

POI导出excel文件,包含校验信息

POI导入excel文件,包含校验信息

qq_40263124的博客 807

从圆形到椭圆:CenterNet中高斯热图半径的自适应优化策略

本文深入探讨了CenterNet目标检测模型中高斯热图生成策略的优化,针对传统圆形高斯核在处理长宽比差异大目标时的局限性,提出了自适应椭圆高斯核的解决方案。通过数学推导和代码实战,详细阐述了如何根据目标边界框尺寸动态计算椭圆长短轴半径,生成更贴合目标几何形状的热图监督信号,从而有效提升模型,尤其是对无人机、车辆等不规则目标的定位精度。

alice7model的博客 986

PTA 7-152 百钱百鸡

PTA 7-152 百钱百鸡

higgins_li的博客 2739

STM32CubeMX安装避坑指南:为什么你的Java环境总是报错?

本文针对STM32CubeMX安装过程中最常见的Java环境报错问题,提供了一套完整的诊断与解决方案。文章深入剖析了JRE版本冲突、环境变量配置错误、路径权限等核心原因,并给出了从系统级检查到手动修正环境变量的详细步骤,帮助开发者彻底解决安装难题,顺利开启STM32开发之旅。

prometheus9mon的博客 227

BMD101传感器协议解析与STM32实现(LCD显示波形)

1 前言 BMD101传感器是神念科技开发的心电传感器。目前有一些商家开发了BMD101传感器模块,基本上都是利用蓝牙直接传输数据到PC或手机端。而本文介绍通过串口将数据传送给单片机,并在单片机上完成数据解析和心电波形LCD显示的功能。 2 通信协议解读 BMD101 通过 UART 接口通信。这是一个标准的 UART 接口,定义为 1 个起始位,8 个数据位,1 停止位格式,波特率 57600。 串口输出的数据包格式如下: 包括Header(帧头)、data payload(数据有效载荷)、CRC校验

weixin_44509533的博客 9291

老师作业之 —— 百钱买百鸡

百钱买百鸡

彩色村 1136

YOLOv11改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

Hello,各位读者们好.本文为最新YOLOv11有效涨点专栏目录,YOLOv11以及发布了一个月左右,这个过程中我也是给大家整理了许多的机制,其中包含了C3k2、主干(均支持根据yolov11训练的版本进行二次缩放,全系列都能轻量化)、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。

Snu77的博客 8万+

PTA 7-191 百钱百鸡

PTA 7-191 百钱百鸡

higgins_li的博客 1731

【部署】Docker部署OpenClaw及常见问题解决(win11)

给AI单独开一个隔离的小容器,AI执行所有命令、下载文件都在这个小盒子里,就算AI被诱导执行危险命令,也不会影响你Win11本机的文件和系统,是必开的安全功能。Docker容器里的OAuth回调,会尝试在你Win11本机的1455端口捕获认证信息,但容器和Win11本机的网络隔离,导致浏览器访问不到这个回调地址。「挂载」就是把你Win11本机的文件夹,共享给容器里的「虚拟小电脑」,两边都能读写文件,比如你想让AI操作你D盘里的代码文件,就需要挂载。

海兰 4699

[Python] 为什么你的脚本明明没报错,却什么也没发生?

Python脚本运行后没报错却没结果?这是许多开发者遇到的棘手问题。文章分析了六种常见原因:代码未进入目标逻辑分支、输出路径错误、中间数据为空、异常被吞掉、异步操作未完成、运行了错误脚本版本。建议通过"过程可视化"排查,如打印关键变量、检查工作目录、验证数据状态等。职场中更应关注结果验证而非单纯代码执行,确保脚本真正解决问题。建立结果验证意识是从"会写代码"到"稳定交付"的关键转变。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 303

PTA 7-152 百钱百鸡(穷举法)

百鸡问题是北魏数学家张丘建在其著作《张丘建算经》中提出的一个世界著名的不定方程问题:“今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。凡百钱买鸡百只,问鸡翁母雏各几何。百钱百鸡问题的白话版:100元钱买100只鸡,公鸡5元1只,母鸡3元1只,小鸡1元3只。问公鸡、母鸡、小鸡各多少只(某种鸡可以为0只)?百钱百鸡的结果如输出样例所示。现在把100改为n,即n元钱买n只鸡,各种鸡价格不变,结果又如何呢?测试数据保证至少存在一组解。测试数据有多组,处理到文件尾。

Y201820221018的博客 2381

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

pta7-4 百钱百鸡

7-4 百钱百鸡百鸡问题:“今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。凡百钱买鸡百只,问鸡翁母雏各几何。百鸡问题是北魏数学家张丘建在《张丘建算经》中提出的一个世界著名的不定方程问题,它给出了由三个未知量的两个方程组成的不定方程组的解。自张丘建以后,中国数学家对百鸡问题的研究不断深入,百鸡问题也几乎成了不定方程的代名词,从宋代到清代围绕百鸡问题的数学研究取得了很好的成就。

m0_62776884的博客 902

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Python优化算法:百钱买百鸡的高效解法

本文探讨了Python在解决经典数学问题'百钱买百鸡'中的高效算法优化方法。从基础的三重循环暴力搜索到数学建模的线性方程求解,逐步展示了如何通过减少循环嵌套、缩小搜索空间和利用数论性质将算法效率提升数万倍。这些Python优化技巧不仅适用于数学问题,也可应用于资源分配、生产计划等实际场景。

weixin_29197699的博客 346

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

7-191 百钱百鸡

分数 10全屏浏览题目切换布局作者 老段单位 成都锦城学院1、中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?要求:给出所有的解,每组解占一行解的顺序:按“字典序”排列,即公鸡数少的在前;公鸡数相同,母鸡数少的在前。

dqd66的博客 979

PTA 百鸡问题扩展-N鸡问题

PTA 百鸡问题扩展-N鸡问题 (10分) 我真要的吐槽一下这个题,当时学校搞校内选拔,我当时一眼看到这个题我以为要用什么动态规划,DFS来搞,然后就写了一个栈的代码,结果内存超限太严重把学校电脑写蓝屏了,然后重新开机写了一遍,一分都某有,真的醉了。 其实不要想太多,两个循环一个搞公????,一个搞母????,在第二个循环里搞一下小鸡们的数量,判断总和是不是N就可以了。 #include<iostream> using namespace std; int main() { int n,c

qq_42439727的博客 1719

PTA:7-191 百钱百鸡

PTA:7-191 百钱百鸡 作者老段 单位成都锦城学院

2301_81508028的博客 472

PTA:7-152 百钱百鸡

PTA:7-152 百钱百鸡 作者usx程序设计类课程组 单位绍兴文理学院

2301_81508028的博客 786

第9周项目6(1)-百钱百鸡问题

/* *Copyright (c) 2014, 烟台大学计算机学院 *All rights reserved. *文件名称:week9-project6-1.cpp *作者:高赞 *完成日期:2014年 10 月 23 日 *版本号:v1.0 * *问题描述:鸡翁一,钱值五;鸡母一,钱值三;鸡雏三,钱值一;百钱买百鸡,问翁,母,雏各几何? *输入描述:无 *

gaozan0902的专栏 634

第3周项目4(1) 百钱买百鸡问题

Copyright (c) 2016, All rights reserced. 文件名称:main.cpp 作者:孙亚茹 完成日期:2016.3.17 问题描述:鸡翁一值五钱,鸡翁母值三钱,三个鸡翁雏值一钱,问用百钱买百鸡,翁,母,雏各几只? #include using namespace std; int main() { int x,y,w

syr201558504128的博客 708
上一篇: springmvc + freemarker 解决表单提交、页面显示乱码 的问题
下一篇: windows 下 安装 redmine
jackshen310
博客等级 码龄15年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值