sdut3140 A*B(math)
题目:传送门
题目描述
输入
The following T lines each contain a single integer number N (0<=N<=2^31-1).
输出
示例输入
1 10
示例输出
Case #1:
25
题意:求一个最小的正整数,使得该正整数的各位数字乘积等于N。(其中正整数这一条件是个坑,0不是正整数,如果输入n==0,则输出结果为10)
因为是各位乘积,所以这题一看就是要分解质因子,如果这个数存在超过10的质因子,则输出-1,否则就是搭配这些质因子使结果最小,因为存在质因子2,3,5,7,7与5只能单独
放在一位上(因为他与其它质因子作积都超过10),之后就是搭配2,3,首先尽可能的搭配两个三,三个2.......总之我就是分解完质因子后暴力做的。
官方解释:
i=9->2每次判断N%i是否等于0,如果等于0,则将9放在生成的数的最后一位。循环结束后判断N是否为1,如果不为1说明无解。举个例子,39=3*13,是无解的。有个特别坑的地方,就是N==0的时候答案是10,而不是0。为什么呢?因为0不是正整数啊~
还是官方解释的言简意赅,我做的有点麻烦,但是思想都是一样的,直接贴代码了!
#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <stack>
#define inf 0x3f3f3f3f
#include <stdio.h>
#include <string.h>
typedef long long ll;
#define mod 10000007
#define eps 1e-9
using namespace std;
int n,ans[],num[],tt,c[],mm;
int main()
{
int T,K=,tt;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
tt=;
printf("Case #%d:\n",++K);
if(n==)
{
printf("10\n");
continue;
}
else if(n==)
{
printf("1\n");
continue;
}
memset(num,,sizeof(num));
for(ll i=;i*i<=n;i++)
{
if(n%i==)
{
ans[tt]=i;
num[tt]++;
n/=i;
while(n%i==)
{
num[tt]++;
n/=i;
}
tt++;
}
}
if(n>)
{
ans[tt]=n;
num[tt++]++;
}
bool flag=false;
for(int i=;i<tt;i++)
{
if(ans[i]>)
{
flag=true;
break;
}
}
if(flag)
{
printf("-1\n");
continue;
}
mm=;
for(int i=tt-;i>=;i--)
{
if(ans[i]==)
{
for(int j=;j<=num[i];j++)
c[mm++]=;
}
else if(ans[i]<) break;
}
for(int i=tt-;i>=;i--)
{
if(ans[i]==)
{
for(int j=;j<=num[i];j++)
c[mm++]=;
}
else if(ans[i]<) break;
}
bool ff=false;
bool yong=false;
for(int i=;i<tt;i++)
{
if(ans[i]==)
{
if(num[i]%==)
{
while(num[i])
{
c[mm++]=;
num[i]-=;
}
}
else
{
ff=true;
while(num[i]>)
{
c[mm++]=;
num[i]-=;
}
}
}
else if(ans[i]>) break;
}
if(ff&&ans[]!=)
{
c[mm++]=;
yong=true;
}
else if(!ff&&ans[]==)
{
while(num[])
{
if(num[]>=)
{
c[mm++]=;
num[]-=;
}
else if(num[]>=)
{
c[mm++]=;
num[]-=;
}
else
{
c[mm++]=;
num[]-=;
}
}
}
else if(ff&&ans[]==)
{
while(num[])
{
if(num[]>=)
{
c[mm++]=;
num[]-=;
}
else if(num[]>=)
{
if(!yong)
{
c[mm++]=;
num[]-=;
yong=true;
continue;
}
c[mm++]=;
num[]-=;
}
else
{
if(!yong)
{
yong=true;
c[mm++]=;
num[]-=;
continue;
}
c[mm++]=;
num[]-=;
}
}
}
if(!yong&&ff)
c[mm++]=;
sort(c,c+mm);
for(int i=;i<mm;i++)
{
printf("%d",c[i]);
}
printf("\n");
}
return ;
}
sdut3140 A*B(math)的更多相关文章
- Python标准库-数字的处理函数(math模块)
Python标准库-数字的处理函数(math模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. #!/usr/bin/env python #_*_conding:utf-8_* ...
- 组合数学(math)
组合数学(math) 题目描述 为了提高智商,zjy开始学习组合数学.某一天她解决了这样一个问题:“给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才能把财宝全部捡完 ...
- PHP函数积累总结(Math函数、字符串函数、数组函数)
Math函数:10个较常用标红.abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切ata ...
- Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)
Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...
- JavaScript的内置对象(Math对象)
Math对象概述 Math(算数)对象的作用是:执行常见的算数任务.保存数学公式和信息. 与我们在JavaScript 直接编写计算功能相比,Math 对象提供的计算功能执行起来要快得多. Math ...
- js 算數(Math)對象
算數對象不需要聲明,可以直接使用, Math對象方法及作用: round()四捨五入: random()生成0到1的隨機數: max()選擇較大的數: min()返回較小的數:
- BC#29A:GTY's math problem(math) B:GTY's birthday gift(矩阵快速幂)
A: HDU5170 这题让比较a^b与c^d的大小.1<=a,b,c,d<=1000. 显然这题没法直接做,要利用对数来求,但是在math库中有关的对数函数返回的都是浮点数,所以这又要涉 ...
- 内置对象(Math对象、Date对象、Array对象、String对象)常用属性和方法
Math对象 Math 是一个内置对象, 它具有数学常数和函数的属性和方法.不是一个函数对象. 与其它全局对象不同的是, Math 不是一个构造函数. Math 的所有属性和方法都是静态的. 跟数学 ...
- golang——随机数(math/rand包与crypto/rand包)
1.math/rand 包 1.1.math/rand 包实现了伪随机数生成器 1.2.主要方法 (1)func Seed(seed int64) 设置随机种子,不设置则默认Seed(1) (2)fu ...
随机推荐
- postgresql data数据目录路径迁移
默认的数据库路径是/var/lib/pgsql/9.x/data 将现有的数据库文件全部拷贝到新的数据库路径下,然后重启 新建一个路径作为新的数据库数据路径,假如是/home/data sudo mk ...
- MySQL5.0、5.1、5.5、5.6功能进化
目前线上使用的版本情况:新上线端口统一使用5.5,不说别的,一个快速恢复重启就值回票价. 但因为历史原因还有大量5.1的版本,甚至,I’am sorry,还有少数5.0的版本. 至于5.0以前的版本, ...
- 更新加子查询加相同的表解决办法 mysql
UPDATE ofuser SET auid = '0' WHERE uid in (SELECT uid FROM (select tmp.* from ofuser tmp)a WHERE aui ...
- c++开发之对应Linux下的sem_t和lock
http://www.cnblogs.com/P_Chou/archive/2012/07/13/semaphore-and-mutex-in-thread-sync.html http://blog ...
- VC++ 窗口拆分CSplitterWnd
前言 当前许多优秀的软件都采用“多视”技术. 所谓“多视”,是指在同一个框架窗口里同时显示多个视图. 通过运用这种技术,可以在框架的有限控件内同时提供用户更大的信息量,并且使得用户界面 ...
- Boatloader的工作流程
(1)第一节阶段的功能 1.硬件设备的初始化 2.载入u-boot第二阶段的代码到我们的RAM空间 3.设置好栈 4.跳转到第二阶段的代码入口 (2)第二阶段的功能 1.初始化本阶段所使用的硬件设备 ...
- 分页技巧__设计分页用的QueryHelper辅助对象
分页技巧__设计分页用的QueryHelper辅助对象 FROM 必须 实体名 WHERE 可选 条件1 AND 条件2 AND ... 条件n ORDER BY 可选 属性1, 属性2, ... ...
- 部署全局ajax处理
$.ajaxSetup({ beforeSend:function(){ $('.loading').show(); }, complete:function(){ $('.loading').fad ...
- Python UnboundLocalError 异常
如下,当我们在函数中对全局变量重新赋值的时候就会出现 UnboundLocalError 异常,虽然 num 这个变量在外部已经被定义成全局变量,但是如果在函数中进行重新赋值操作,python 会自动 ...
- iOS: NSObject中执行Selector的相关方法
本文转载至 http://www.mgenware.com/blog/?p=463 1. 对当前Run Loop中Selector Sources的取消 NSObject中的performSelect ...