• The 70th problem,UVa10396 Vampire Numbers


           今天看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("
    ");
    
        }
    
    }
    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 讲的不错。

    
    


     

  • 相关阅读:
    Linux内核之系统调用
    [转]Linux最多支持的SCSI Disk的数目
    bash一些技巧
    [转]Iptables 规则 一些简单实例和详细介绍
    近来工作和面试一些人的感受(原)
    自动给URL地址加上超链接
    在ASP.NET虚拟主机上实现URL重写(UrlRewrite)
    使用Office组件读取Excel,引用Microsoft.Office.Interop.Excel出现的问题
    Fixing Twitter 提高世界上最流行的微博客系统性能和可扩展性(转)
    从优酷网学习SEO的标题(title)和关键字(keywords)如何选择
  • 原文地址:https://www.cnblogs.com/wxisme/p/4363770.html
Copyright © 2020-2023  润新知