今天看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. 制作Windows Server 2008安装启动U盘

    昨天刚下了Windows server 2008因为没有刻录机,所以我就用2G U盘把Windows server 2008光盘镜像做成U盘安装效果和光盘安装一样. 下面就是制作方法: UltraIS ...

  2. MySql 生成日期随机数

    select DATE_ADD(sd, INTERVAL FLOOR(1+ RAND() * ((ABS(UNIX_TIMESTAMP(ed) - UNIX_TIMESTAMP(sd))) - 1)) ...

  3. jar/war/ear文件的区别

     jar/war/ear三种文件,在文件结构上,三者并没有什么不同,它们都采用zip或jar档案文件压缩格式.但是它们的使用目的有所区别: Jar文件(扩展名为. Jar)包含Java类的普通库.资源 ...

  4. node-webkit连接mysql

    一.安装node.js mysql驱动库 node-webkit里面没有mysql模块的,我们需要安装mysql模块.我们可以使用npm(Node package manager)进行安装.这里使用到 ...

  5. 利用jQuery进行三行两列等高布局

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. ajax回调函数中使用$(this)取不到对象的解决方法

    如果在ajax的回调函数内使用$(this)的话,实践证明,是取不到任何对象的,需要的朋友可以参考下 $(".derek").each(function(){ $(this).cl ...

  7. 控件EditText

    (一)监听EditText输入内容变化 EditText.addTextChangedListener(textWatcher); //EditText change listener    //此方 ...

  8. 各个层次的gcc警告

    http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attri ...

  9. 【转】DWM 窗体玻璃效果实现

    我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...

  10. Centos6.8搭建Git服务(git版本可选)

    搭建Git服务器需要准备一台运行Linux的机器,本文以Centos6.8纯净版系统为例搭建自己的Git服务. 准备工作:以root用户登陆自己的Linux服务器. 第一步安装依赖库 [root@lo ...