今天看Thinking in Java看到一个吸血鬼数的问题,于是查找UVa里也有类似的问题就动手写了先是用Java写的,不过WA了两次,然后没有发现错误,又用c++写的还是不行。最后发现要排序去重。然后改用Java的SortedSet解决了这个问题,主要就是暴力枚举求解。但是同样的算法Java用了将近5秒。c++只用了1秒。差距啊。还有避免不必要的重复的循环不能为00,还有不能为奇数。尽量提高程序的效率。

题目描述:

Problem D

Vampire Numbers

Input: standard input

Output: standard output

Time Limit: 5 seconds

A number v = xy with an even number (n) of digits formed by multiplying a pair of n/2-digit numbers (where the digits are taken from the original number in any order) x and y together is known as vampire number. Pairs of trailing zeros (Both the numbers have a trailing zero) are not allowed. If v is a vampire number then x and y are called its "fangs." Examples of 4-digit vampire numbers include

1) 21 x 60 = 1260
2) 15 x 93 = 1395
3) 35 x 41 = 1435
4) 30 x 51 = 1530
5) 21 x 87 = 1827
6) 27 x 81 = 2187
7) 80 x 86 = 6880

In this program you will have to find all the 4, 6 and
8 digit even vampire numbers.

Input

The input file contains maximum ten lines of input. Each line contains a single integer n whose value is
4, 6 or 8. Input is terminated by end of file.

Output

For each input n produce all the n-digit vampire numbers that are even in ascending order. Print a blank line after the output for each set of input.

Sample Input:

4

4

Sample Output:

1260

1530

6880

1260

1530

6880

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; int main()
{
bool isNum(int a,int b);
int n;
int range[] = {1,10,100,1000,10000};
int set[10][10000],flag[10];
memset(set,0,sizeof(range));
memset(flag,0,sizeof(flag));
while(scanf("%d",&n) != -1)
{
if(flag[n] == -1)
{
int k = 0;
for(int i=range[n / 2 - 1]; i<range[n / 2]; i++)
{
for(int j=i; j<range[n / 2]; j++)
{
if(i % 2 != 0 && j % 2 != 0)continue;
if(i % 10 == 0 && j % 10 == 0)continue;
if(isNum(i,j))
{
set[n][k] = i * j;
k++;
}
}
} }
flag[n] = -1;
for(int i=0; ; i++)
{
if(set[n][i] == 0)break;
printf("%d",set[n][i]);
}
printf("\n"); } }
bool isNum(int a,int b)
{
int arr[10];
int mult = a * b;
while(a != 0)
{
arr[a % 10]++;
a /= 10;
}
while(b != 0)
{
arr[b % 10]++;
b /= 10;
}
while(mult != 0)
{
arr[mult % 10]--;
mult /= 10;
}
for(int i=0; i<10; i++){
if(arr[i] != 0)
return false;
}
return true;
}
Java代码:
<pre class="java" name="code">import java.util.*;

public class Main10396 {

	public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] range = {1,10,100,1000,10000};
Object[] temp = new Object[100000];
int[] flag = new int[10];
SortedSet<Integer> set4 = new TreeSet<Integer>();
SortedSet<Integer> set6 = new TreeSet<Integer>();
SortedSet<Integer> set8 = new TreeSet<Integer>();
while(scan.hasNext()){
int n = scan.nextInt();
int k = 0;
if(flag[n] != -1){
for(int i=range[n / 2 - 1]; i<range[n / 2]; i++){
for(int j=i; j<range[n / 2]; j++){
if((i % 2 != 0)&& (j % 2 != 0))continue;//除去奇数
if(i % 10 == 0 && j % 10 == 0)continue;//除去00
if(isNum(i,j) == true){
if(n == 4){
set4.add(i * j);
}
if(n == 6){
set6.add(i * j);
}
if(n == 8){
set8.add(i * j);
}
}
}
}
}
flag[n] = -1;
if(n == 4){
for(int i : set4){
System.out.println(i);
}
}
if(n == 6){
for(int i : set6){
System.out.println(i);
}
}
if(n == 8){
for(int i : set8){
System.out.println(i);
}
}
System.out.println(); } }
public static boolean isNum(int a,int b){
int[] arr = new int[10];
int mult = a * b;
while(a != 0){
arr[a % 10]++;
a /= 10;
}
while(b != 0){
arr[b % 10]++;
b /= 10;
}
while(mult != 0){
arr[mult % 10]--;
mult /= 10;
}
for(int i=0; i<10; i++){
if(arr[i] != 0)
return false;
}
return true;
} }

最后说一句Tinking in Java 讲的不错。

												

The 70th problem,UVa10396 Vampire Numbers的更多相关文章

  1. (Problem 21)Amicable numbers

    Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into ...

  2. HNUSTOJ-1565 Vampire Numbers(暴力打表)

    1565: Vampire Numbers 时间限制: 3 Sec  内存限制: 128 MB提交: 20  解决: 9[提交][状态][讨论版] 题目描述 The number 1827 is an ...

  3. 覆盖问题:最大覆盖问题(Maximum Covering Location Problem,MCLP)和集覆盖问题(Location Set Covering Problem,LSCP)

    集覆盖问题研究满足覆盖所有需求点顾客的前提下,服务站总的建站个数或建 设费用最小的问题.集覆盖问题最早是由 Roth和 Toregas等提出的,用于解决消防中心和救护车等的应急服务设施的选址问题,他们 ...

  4. 拜占庭将军问题(Byzantine Generals Problem),一个关于分布式系统容错问题故事

    拜占庭将军问题(Byzantine Generals Problem),一个关于分布式系统容错问题故事 背景:拜占庭帝国派出10支军队,去包围进攻一个强大的敌人,至少6支军队同时进攻才能攻下敌国. 难 ...

  5. 木块问题(The Blocks Problem,Uva 101)

    不定长数组:vector vector就是一个不定长数组.不仅如此,它把一些常用操作“封装”在了vector类型内部. 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resi ...

  6. algorithm@ Sieve of Eratosthenes (素数筛选算法) & Related Problem (Return two prime numbers )

    Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is ...

  7. LeetCode第四题,Add Two Numbers

    题目原文: You are given two linked lists representing two non-negative numbers. The digits are stored in ...

  8. (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。

    Problem Description   Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...

  9. Prime ring problem,递归,广搜,回溯法枚举,很好的题

    题目描述: A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each ...

随机推荐

  1. Json转list,两种包,两种方式

    1.使用fastjson 对于json串大小写没什么要求,测试的时候,我把javaBean属性设置成和json串一样的大小写,代码如下: package com.myTest.json.test1; ...

  2. Elastic-Job - 分布式定时任务框架

    Elastic-Job - 分布式定时任务框架 摘要 Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范 ...

  3. Cocos2d-x 3.0final 终结者系列教程06-Director和场景跳转

    这些天互联网大事不少呀 1.逻辑思维分家(所谓合久必分,分久必合,实属正常.切行切珍惜吧) 2. 锤子手机开卖  (无论你买没买,反正我没买,作为多年Android开发的我深知说的亮点事实上在我看来都 ...

  4. c#生成rsa公钥和私钥

    c#生成rsa公钥和私钥的类库,包括加密解密,可以用在网站和winform项目 源码地址: http://download.csdn.net/detail/jine515073/8383809

  5. 设计中最常用的CSS选择器

    准确而简洁的运用CSS选择器会达到非常好的效果.我们不必通篇给每一个元素定义类(class)或ID,通过合适的组织,可以用最简单的方法实现同样的效果.在实际工作中,最常用的选择器有以下五类: 一.标签 ...

  6. Java 二维码--转载

    周末试用下Android手机的二维码扫描软件,扫描了下火车票.名片等等,觉得非常不错很有意思的.当然Java也可以实现这些,现在就分享下如何简单用Java实现二维码中QRCode的编码和解码(可以手机 ...

  7. numpy库中的知识点——积累

    下面是一些杂碎的知识点: 首先我们说说多维数组: 数组的属性: ndarray.ndim, 表示数组的秩是多少: ndarray.shape,返回数组的形状: ndarray.size,数组元素的总个 ...

  8. R语言低级绘图函数-text

    text函数用来在一张图表上添加文字,只需要指定对应的x和y坐标,以及需要添加的文字内容就可以了 基本用法: plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6), ...

  9. oracle用sql 语句如何向表中插入时间?

    有关日期的操作中,更多的是涉及系统当前时间,用sysdate表示即可,如果是插入其他非系统时间的日期类型数据的话,用to_date转换再插入就可以了.例: insert into 表(c_date) ...

  10. Sharepoint 2013 Workflow Error

    问题: (1)提示“reload the page and then start the workflow”错误 (2)提示“Unable to properly communicate with t ...