第一次写博客,有点紧张。。。

也许格式也没有特别丑吧

先看原题(

此题做法众多,这里仅仅介绍蒟蒻的一种很复杂的思路(但最后还是喜提0ms的好成绩)

读完这道题,不难发现,此题不过是一个质因数分解+一堆特判

1.质因数分解

作为无系的优秀学子,我们很自然的联想到《程序设计基础》中曾经多次出现的质因数分解。毕竟,本题要求我们输出的各个数位都是原数的因数,那么求解因数的方法在我们的思维中首先就是分解质因数啦。

此外,如果我们愿意多花一小段时间分析,我们也不难看出,如果输入的数字分解质因数后存在11或者更大的质因数,那么一定是不满足题目要求的!直接输出-1即可。

那么,对于其他的数字,其分解质因数的结果只能有:2,3,5,7;

比如,对于数字100,有质因数分解数列:2 2 5 5

因此,2255是满足题目条件的一个数。

2.合并质因数,减少数位

为了让数字最小,我们自然要让数位越小越好。对于2和3,有2*2*2=8,3*3=9,2*3=6,得到的仍然是一位数。那么,如果我们把原质因数列中的2和3合并起来,是不是就达到减少数位的目的了呢?

比如上述的2255,如果我们把2*2合并成4,得到455,其实就达到了减少数位的目的。

对于其他的乘法,自然也是一样的。

但是,对于众多的2和3,我们有很多合并的方式,但我们分析得出:当合并出的因数最大时,对我们减小数字是最有利的。

比如:72=2*2*2*3*3,我们最好的方法是89,而非其他的方案。

此处应用到简单的数学知识,自然难不倒作为无系dalao的你吧。

3.对数列进行排序,取得最小数

在进行第二步之前,由于我们在质因数分解时得到的数列是有序的,我们得到的数满足是“当前数位组成下的最小的数”。但是,合并数位后,我们得到的数字也许不再是有序的。

我采用的办法是,多开了一个数组,在合并质因数的时候直接在原数组中删去因数,在新数组中得到积,这样省去了繁琐的数组坐标移动过程。

然后再把两个数组拼接起来,用sort函数进行排序,就得到符合题意的最小数啦。

4.彩蛋

当我们兴致勃勃的开始评测的时候:

好似!开香槟喽!

结果:

作为无系oj的第一题,本题为大家准备了意外惊喜

我们从小就学过,自然数=正整数+0,那么再去阅读题干,聪明的你一定发现了出题人的深意吧!

附:AC代码

#include<cstdio>
#include<algorithm>
using namespace std;
int a[100],b[100];
int main(){
int n;
scanf("%d",&n);
if(!n){printf("10");return 0;}
if(n<10){printf("%d",n);return 0;}
int i,t=1;
for(int i=2;i*i<=n;i++){
while(!(n%i)){
a[t++]=i;n/=i;
}
}
if(n>1)a[t++]=n;
int l2=0,r2=0,r3=0,l3=0,q=1,bq=0;
for(int i=1;i<t;i++){
if(a[i]==2&&(!l2))l2=i;
if(a[i]==2&&a[i+1]!=2)r2=i;
if(a[i]==3&&(!l3))l3=i;
if(a[i]==3&&a[i+1]!=3)r3=i;
if(a[i]>3&&(!bq)){q=i;bq=1;}
if(a[i]>9){printf("-1");return 0;}
}
int num2=0,num3=0,bnum=1;
for(int i=l3;i<=r3&&r3>0;i++){
num3++;
if(num3==2){
b[bnum++]=9;
num3=0;
}
}
for(int i=l2;i<=r2&&r2>0;i++){
num2++;
if(num2==3){
b[bnum++]=8;
num2=0;
}
}
if(num2&&num3){b[bnum++]=6;num2--;num3--;}
if(num2==2){b[bnum++]=4;num2-=2;}
if(num3){b[bnum++]=3;num3--;}
if(num2){b[bnum++]=2;num2--;}
for(int i=t;i<t+bnum-1;i++)a[i]=b[i-t+1];
sort(a+q,a+bnum+t-1);
for(int i=q;i<t+bnum-1;i++)printf("%d",a[i]);
}

下次会好好调整格式的

2021夏季学期华清大学EE数算OJ1:算数问题的更多相关文章

  1. 2021夏季学期华清大学EE数算OJ2:难缠的店长

    2021年夏季学期华清大学电子系数算oj2题解 某知名oier锐评蒟蒻的oj1题解: 话不多说,进入oj2题解: 难缠的oj 之 难缠的店长 当时读完我已经因为无良甲方的行为出离愤怒了!但是做题还是要 ...

  2. 2021春季学期华清大学EE数算OJ3:岩石的重量

    原题目如下: 看起来,这不过是我们在<程序设计基础>里面接触过的简单动态规划问题(什么,你不知道什么叫动态规划? 什么是动态规划? 百度百科对"动态规划"一词定义如下: ...

  3. 毕业样本=[华威大学毕业证书]Warwick原件一模一样证书

    华威大学毕业证[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归& ...

  4. 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级

    近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...

  5. 基于华清远见STM32f051的 IIC从模式实现方法

    作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...

  6. 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版

    2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...

  7. [华清远见]FPGA公益培训

    本套视频教程为华清远见 网络公益培训活动,主讲人:姚远老师,华清远见高级讲师. ------------------------------------------------------------ ...

  8. 华清远见Linux设备驱动(每章小结)

    1.  linux设备驱动是以内核模块的方式而存在的,在具体的驱动开发中将驱动编译为模块具有很到的工程意义.因为如果将正在开发中的驱动编译如内核,而开发过程中会不断修改驱动代码,则需要不断的编译和重启 ...

  9. hdu 5228 OO’s Sequence(单独取数算贡献)

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

随机推荐

  1. 详解BI系统中的任务调度

    任务调度是一个通用的计算机概念,可以简单地理解为计算机基于一定时间频率,自动执行一项进程任务.任务调度是操作系统的重要组成部分,Windows系统中的定时任务和Linux的Crontab都是常用的系统 ...

  2. jsp技术之隐藏域

    隐藏域 hidden:隐藏域属性,不显示到页面上,但是会提交的表单项 注意:表单中增加了一个隐藏域,是用户的id.稍后修改联系人信息,提交表单时需要使用到 <!-- hidden:隐藏域,不显示 ...

  3. AGENS算法

    3.2 层次方法 下图,上面是从左到右由5个簇逐渐合并成1个簇的过程,下面是从右到左由一个簇逐渐分裂成5个簇的过程 AGENS算法 最后面一句话是重点,假设有<A,B>,<C,D&g ...

  4. 位运算符 按位与 &——整数n的二进制数中1的个数

    整数n的二进制数中1的个数 编写一个函数,输入是一个整数,返回其二进制表达式中数字位数为 '1' 的个数 代码如下: int func(int n)//char ch { int count = 0; ...

  5. Python函数-导入模块的顺序及原理

    引入 当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这 ...

  6. volist标签的各种属性

    volist标签通常用于查询数据集(select方法)的结果输出,通常模型的select方法返回的结果是一个二维数组,可以直接使用volist标签进行输出. 在控制器中首先对模版赋值: $User = ...

  7. 探索前端黑科技——通过 png 图的 rgba 值缓存数据

    本文系原创,欢迎转载,转载请注明作者信息项目地址:SphinxJS在线体验地址:https://jrainlau.github.io/sp... 说起前端缓存,大部分人想到的无非是几个常规的方案,比如 ...

  8. C#编写程序,用 while 循环语句实现下列功能

    编写程序,用 while 循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个. 代码: using Sys ...

  9. PAT B1056组合数的和

    给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 2 位数字的和.例如给定 2.5.8,则可以组合出:25.28.52.58.82.85 ...

  10. JAVA环境搭建之MyEclipse10+jdk1.8+tomcat8环境搭建详解

    一.安装JDK 1.下载得到jdk-8u11-windows-i586.1406279697.exe,直接双击运行安装,一直next就可以,默认是安装到系统盘下面Program Files, 我这里装 ...