zoukankan      html  css  js  c++  java
  • hdu 3826 Squarefree number 数论

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define nmax 1000001
    int prime[nmax], plen;
    void init() {
    	memset(prime, -1, sizeof(prime));
    	int i, j;
    	for (i = 2; i < nmax; i++) {
    		if (prime[i]) {
    			for (j = i + i; j < nmax; j += i) {
    				prime[j] = 0;
    			}
    		}
    	}
    	for (i = 2, plen = 0; i < nmax; i++) {
    		if (prime[i]) {
    			prime[plen++] = i;
    		}
    	}
    }
    int solve(long long n) {
    	int i;
    	for (i = 0; (i < plen) && (prime[i] < n); i++) {
    		if (n % prime[i] == 0) {
    			n /= prime[i];
    			if (n % prime[i] == 0) {
    				return 0;
    			}
    		}
    	}
    	return 1;
    }
    int main() {
    #ifndef ONLINE_JUDGE
    	freopen("t.txt", "r", stdin);
    #endif
    	init();
    	int i, t, te, flag;
    	long long n;
    	while (scanf("%d", &t) != EOF) {
    		for (i = 1; i <= t; i++) {
    			scanf("%I64d", &n);
    			flag = solve(n);
    			printf("Case %d: ", i);
    			if (flag) {
    				te = (int) (sqrt(n * 1.0));
    				if (((long long) (te)) * te == n) {
    					printf("No\n");
    				} else {
    					printf("Yes\n");
    				}
    			} else {
    				printf("No\n");
    			}
    		}
    	}
    	return 0;
    }
    

    以下转载于:

    http://hi.baidu.com/304467594/blog/item/f02407ea9eeecac62f2e2136.html

    /*
    要判断给定的n(2<=n<=10^18)是不是squarefree number;
    因为给定的数最大达到10^18,所以直接暴力肯定是杯具的TLE;
    10^18=10^6^2*10^6;
    */

    下面是神龙的解题思路,我跳过了第三步;
    /*
    1. 计算1000000以下 素数,存于 prime[ ]

    2. 计算N的 小于1000000的因子p,如果有平方因子,则No,转 5
        否则 N=N/p
    3.  消除N的小于 1000000的因子p后,若N=1 , 则Yes,转 5
    4.  N必为 3种之一: 素数,素数的平方,两个不同素数之积。
       因此判断 N是否平方数,是平方数则No,不是则Yes
    5. 结束 
    */

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define nmax 1000001
    int prime[nmax], plen;
    void init() {
    	memset(prime, -1, sizeof(prime));
    	int i, j;
    	for (i = 2; i < nmax; i++) {
    		if (prime[i]) {
    			for (j = i + i; j < nmax; j += i) {
    				prime[j] = 0;
    			}
    		}
    	}
    	for (i = 2, plen = 0; i < nmax; i++) {
    		if (prime[i]) {
    			prime[plen++] = i;
    		}
    	}
    }
    int solve(long long n) {
    	int i;
    	for (i = 0; (i < plen) && (prime[i] < n); i++) {
    		if (n % prime[i] == 0) {
    			n /= prime[i];
    			if (n % prime[i] == 0) {
    				return 0;
    			}
    		}
    	}
    	return 1;
    }
    int main() {
    #ifndef ONLINE_JUDGE
    	freopen("t.txt", "r", stdin);
    #endif
    	init();
    	int i, t, te, flag;
    	long long n;
    	while (scanf("%d", &t) != EOF) {
    		for (i = 1; i <= t; i++) {
    			scanf("%I64d", &n);
    			flag = solve(n);
    			printf("Case %d: ", i);
    			if (flag) {
    				te = (int) (sqrt(n * 1.0));
    				if (((long long) (te)) * te == n) {
    					printf("No\n");
    				} else {
    					printf("Yes\n");
    				}
    			} else {
    				printf("No\n");
    			}
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Java基础学习篇---------static
    Java基础学习篇---------this、object的学习
    Java基础学习篇---------String、集合的学习
    Java基础学习篇---------多态
    Java基础学习篇---------继承
    Java基础学习篇---------封装
    Java基础学习篇---------多线程
    Handler主线程和子线程相通信
    Handler的使用
    c# DataGridView操作
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2119288.html
Copyright © 2011-2022 走看看