今天看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. 华为console口配置

    c.单击“Connect”,终端界面会出现如下显示信息,提示用户配置登录密码.设备缺省用户名为admin,密码为Admin@huawei.(以下显示信息仅为示意) user-interface con ...

  2. window上将MongoDB的启动加入到服务中

    在系统管理员的命令行模式中: 进入mongo的安装目录,参照如下: 其中: --dbpath为保存的数据的路径 mongod --bind_ip --serviceName "MongoDB ...

  3. div绝对定位针对手机浏览器的区别

    最近在对ipad和安卓平板做测试,发现我自己写的一个下拉控件在安卓浏览器里面被遮盖了,但是PC或者ipad都没有这个现象,一开始以为是z-index 可是无论我调多少都没有用,研究了好久,发现是代码的 ...

  4. CDH impala安装

    环境 CDH版本:5.12.1 添加impala parcel 1.菜单“主机”-->Parcel-->配置-->远程 Parcel 存储库 URL,点击添加按钮,添加一个URL,h ...

  5. windows rails new demo时候出错Make sure that `gem install mysql2 -v '0.3.15'` succeeds before bundling.

    rails new demo --database=mysql最后报错Gem files will remain installed in D:/BillFiles/rails_dev/Ruby193 ...

  6. GSM错误代码表

    转:http://blog.csdn.net/renjwjx/article/details/2290667 GSM device:  AT+CMEE=1  AT&W  CME ERROR's ...

  7. Laravel 多where组合

    $model=DB::table("user"); foreach($request as $value){ if($value->name){ $model->whe ...

  8. js类型转换 之 转字符串及布尔类型

    上一篇我们讲到了如何转数字类型,今天总结一下转字符串及布尔类型的方法: 转字符串方法主要有: toString(); String(); 具体的用法如下表格所示: 方法 例子 返回值 说明 toStr ...

  9. js学习笔记18----元素创建操作

    1.父级.appendChild(新的元素) 从后面开始追加子元素. 2.父级.insertBefore(新的元素,被插入的元素) 在指定元素前面开始插入一个新元素. 兼容性:在ie下,如果第二个参数 ...

  10. 回调方法介绍之中国好室友篇(Java示例)

    前言 在Java社区的各种开源工具中,回调方法的使用俯拾即是.所以熟悉回调方法无疑能加速自己对开源轮子的掌握.网上搜了一些文章,奈何对回调方法的介绍大多只停留在什么是回调方法的程度上.本篇文章尝试从回 ...