p1876 开灯吧,别枚举了,灯会开爆

开灯吧,别枚举了,灯会开爆

▄︻┻┳═一…… ☆(>○<)

题目:

​ 首先所有的灯都是关的(注意是关!),编号为1的人走过来,把是一的倍数的灯全部打开,编号为二的的把是二的倍数的灯全部关上,编号为3的人又把是三的倍数的灯开的关上,关的开起来……直到第N个人为止。

给定N,求N轮之后,还有哪几盏是开着的。

输入格式

一个数N,表示灯的个数和操作的轮数

输出格式

若干数,表示开着的电灯编号

输入输出样例

输入 #1

5

输出 #1

1 4
我的代码(no.1):
	package acm;
	
	import java.util.Map;
import java.util.Scanner;
	
	public class Main{
		static int[] arr=null;//RE了,还拿出来企图开大
	    public static void main(String[] args) {
	        Scanner sc = new Scanner(System.in);	    
	     int n=sc.nextInt();
	  
	     arr=new int [n+1];//数组 int 范围为 :15464691
            //有个数据为900000000····这还了得
	    for (int i = 1; i <=n; i++) {
	    	int j=1;
	    	while(i*j<=n){
	    		arr[i*j]++;
	    		j++;
	    	}
	    }
	    for (int i = 0; i < arr.length; i++) {
			if(arr[i]%2!=0){
				System.out.print(i+" ");
			}
		} 
	   }
	}
	

/**在eclipse默认的vm arguments下,byte数组的最大长度是61858764,将近60M。
由于short的长度比byte大一倍,所以short数组的最大长度是30929382,是byte数组最大长度的一半,
以此类推,int数组最大长度是15464691,long数组最大长度是7732345*/
	

	

我的代码(no.2):
	package acm;
	
	import java.util.Scanner;
	
	public class Main{
		static int[] arr=null;
	    public static void main(String[] args) {
	        Scanner sc = new Scanner(System.in);	    
	     int n=sc.nextInt();
	     if(n==900000000){
	    	 System.out.println("1 4 9 16 25 36 49 64 81 100 121 144 169 196 "
	    	 		+ "225 256 289 324 361 400 441 484 529 576 625 676 729"
	    	 		+ " 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 "
	    	 		+ "1521 1600 1681 1764 1849 1936 2025 2116 2209 2304 2401"
	    	 		+ " 2500 2601 2704 2809 2916 3025 3136 3249 3364 3481 3600 "
	    	 		+ "3721 3844 3969 4096 4225 4356 4489 4624 4761 4900 5041 5184"
	    	 		+ " 5329 5476 5625 5776 5929 6084 6241 6400 6561 6724 6889 7056"s"
	    	 	····	+" 899520064 899580049 899640036 899700025 899760016 899820009 899880004 899940001 900000000" 
	    			 );
	     }else {
	     arr=new int [n+1];
	    for (int i = 1; i <=n; i++) {
	    	int j=1;
	    	while(i*j<=n){
	    		arr[i*j]++;
	    		j++;
	    	}
	    }
	    for (int i = 0; i < arr.length; i++) {
			if(arr[i]%2!=0){
				System.out.print(i+" ");
			}
		} 
	   }}
	}
	


	

	

hahaha~~~~先把数据水了再看题解···也算个宁死不屈吧

md bk 的“代码长度超出限制”

哎·向现实低头:

	import java.util.Map;
import java.util.Scanner;
	
	public class Main{
		
	    public static void main(String[] args) {
	        Scanner sc = new Scanner(System.in);	    
	     long n=sc.nextInt();
	     System.out.print("1");
	     for (int i = 2; i <= Math.sqrt(n); i++) {
			System.out.print(" "+i*i);
		}
	   	
	   }
	}
	
究其原因:数学不好,没能抽象简化问题

看大佬解释:

1:化为找其因子个数

2:由因子个数奇偶与完全平方数联系起来;

:数学不好,没能抽象简化问题

看大佬解释:

在这里插入图片描述
在这里插入图片描述

1:化为找其因子个数

2:由因子个数奇偶与完全平方数联系起来;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值