poj1426: Find the Multiple

探讨了一种算法问题,即找到一个整数的最小倍数,该倍数能够被表示为01序列。文章提供了两种解决方案,一种是使用BFS算法但未通过测试,另一种是利用数学技巧简化问题并成功解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目就是找到一个数的可以用01序列表示的最小倍数。

2. 自己用java写,无法ac,超时。到网上查,发现大家说的也是此题可以水过去,就是数字是不需要大数的。按照正常的bfs即可。下面第一段代码就是bfs,但是没有ac.但是大家用的都是c++。自己用java无法。

3. 后来参考了高手的,才觉得写得真好。首先用同余模定理简化,当然,其实按理论最后的结果还是很大。但是按照测试,此题不用大数也可以过。然后是根据一个小窍门得到最终结果。就是求模的过程倒过来除以2就是要的数了。

首先是自己写的没有ac的:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Multiple {

	static int n;
	static LinkedList<Long> queue =new LinkedList<Long>();
	static ArrayList<Long> list = new ArrayList<Long>();
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		for(int i = 1; i<=200; i++)
		{
			n = i;
			bfs();
			
		}
		//File file =  new File("C://Users/23192/Desktop/multiple.txt");
		try {
			//Scanner scan = new Scanner(file);
			Scanner scan = new Scanner(System.in);
			while(scan.hasNext())
			{
				queue.clear();
				n = scan.nextInt();
				if(n==0)
					return;
				System.out.println(list.get(n-1));
				//bfs();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static  void bfs()
	{
		queue.add((long) 1);
		
		while(!queue.isEmpty())
		{
			Long x = queue.poll();
			//System.out.println("x:"+x);
			if(x%n==0)
			{
				//System.out.println(x);
				list.add(x);
				return;
			}
			queue.add(x*10+0);
			queue.add(x*10+1);
		}
	}

}

然后是采用小窍门后的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			
			Scanner scan = new Scanner(System.in);
			while(scan.hasNext())
			{
				//int []mod = new int[524286]; 
				int []mod = new int[500000]; 
				int n = scan.nextInt();
			    
			        if(n==0)  
			            return;  
			  
			        mod[1]=1%n;  
			       int i;
			        for(i=2;mod[i-1]!=0;i++) 
			            mod[i]=(mod[i/2]*10+i%2)%n;  
			                   
			        i--;  
			        int pm=0;  
			        while(i!=0)  
			        {  
			            mod[pm++]=i%2;  
			            i/=2;  
			        }  
			        while(pm!=0)  
			         System.out.print(mod[--pm]); 
			       System.out.println();
			    }  
			   
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值