题目:传送门

题目描述

Your task is to find the minimal positive integer number Q so that the product of digits of Q is exactly equal to N.

输入

The first line of input contains T, number of test cases. 
The following T lines each contain a single integer number N (0<=N<=2^31-1).

输出

For each test case, your program should first print to the output "Case #i:"(i is the case number) in one line, and then the number Q in the second line. If such a number does not exist print -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)的更多相关文章

  1. Python标准库-数字的处理函数(math模块)

    Python标准库-数字的处理函数(math模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. #!/usr/bin/env python #_*_conding:utf-8_* ...

  2. 组合数学(math)

    组合数学(math) 题目描述 为了提高智商,zjy开始学习组合数学.某一天她解决了这样一个问题:“给一个网格图,其中某些格子有财宝.每次从左上角出发,只能往右或下走.问至少要走几次才能把财宝全部捡完 ...

  3. PHP函数积累总结(Math函数、字符串函数、数组函数)

    Math函数:10个较常用标红.abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切ata ...

  4. Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)

    Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...

  5. JavaScript的内置对象(Math对象)

    Math对象概述 Math(算数)对象的作用是:执行常见的算数任务.保存数学公式和信息. 与我们在JavaScript 直接编写计算功能相比,Math 对象提供的计算功能执行起来要快得多. Math ...

  6. js 算數(Math)對象

    算數對象不需要聲明,可以直接使用, Math對象方法及作用: round()四捨五入: random()生成0到1的隨機數: max()選擇較大的數: min()返回較小的數:

  7. 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库中有关的对数函数返回的都是浮点数,所以这又要涉 ...

  8. 内置对象(Math对象、Date对象、Array对象、String对象)常用属性和方法

    Math对象 Math 是一个内置对象, 它具有数学常数和函数的属性和方法.不是一个函数对象. 与其它全局对象不同的是, Math 不是一个构造函数.  Math 的所有属性和方法都是静态的. 跟数学 ...

  9. golang——随机数(math/rand包与crypto/rand包)

    1.math/rand 包 1.1.math/rand 包实现了伪随机数生成器 1.2.主要方法 (1)func Seed(seed int64) 设置随机种子,不设置则默认Seed(1) (2)fu ...

随机推荐

  1. cmake 安装 mysql5.5 版本

    1.安装确保以下系统相关库文件 gcc gcc-c++ autoconf automake zlib* libxml* ncurses-devel libmcrypt* libtool*(libtoo ...

  2. printf 字体颜色打印

    为了给printf着色方便, 我们可以定义一些宏: view plain copy to clipboard print ? #define NONE          "/033[m&qu ...

  3. 【mysql】一次有意思的数据库查询分析。

    本文是在做一家汽车配件的电商网站时,大体情景是一个List.php页面,该页面分页列出部分配件并统计总数量用于分页. 当然该页面中也可以指定一下查询条件,如适配的车辆品牌.车系.排量.年份等,一件商品 ...

  4. 【Python】用文本打印树

    From:http://zhidao.baidu.com/link?url=O8U5TynGBMojDw2iFhlghPPf5_ZE1X8CAQMrK19pv-KxhvKCc6Z2yzsoQaukgN ...

  5. python入门(七):CGI编程

    CGI CGI(Common Gateway Interface),通用网关接口,HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. CGI在其中扮演的是在we ...

  6. PHP项目中经常用到的无限极分类函数

    //无限极分类函数调用 function getTree($data,$parent_id = 0,$dept_level = 0){ static $tree = []; foreach ($dat ...

  7. mybatis 控制台打印出来的sql 执行结果为空 但是将sql放到mysql执行有数据

    mybatis中的sql如下 select airln_Cd airlnCd,city_coordinate_j cityCoordinateJ,city_coordinate_w cityCoord ...

  8. android开发环境之ADT安装,卸载,更新

    http://hj198703.iteye.com/blog/1316991   1.官网:http://developer.android.com/sdk/index.html2.ADT组件在线安装 ...

  9. poj_2823 线段树

    题目大意 给定一行数,共N个.有一个长度为K的窗口从左向右滑动,窗口中始终有K个数字,窗口每次滑动一个数字.求各个时刻窗口中的最大值和最小值. 题目分析 直接搜索,复杂度为O(n^2).本题可以看做是 ...

  10. nat123动态域名解析软件使用教程

    nat123动态域名解析软件使用教程