程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 3826 數論 n能否被含有因子是一個平方數的數整出 很不錯的題目

hdu 3826 數論 n能否被含有因子是一個平方數的數整出 很不錯的題目

編輯:C++入門知識

Squarefree number
Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1404    Accepted Submission(s): 373


Problem Description
In mathematics, a squarefree number is one which is divisible by no perfect squares, except 1. For example, 10 is square-free but 18 is not, as it is divisible by 9 = 3^2. Now you need to determine whether an integer is squarefree or not.
 

Input
The first line contains an integer T indicating the number of test cases.
For each test case, there is a single line contains an integer N.

Technical Specification

1. 1 <= T <= 20
2. 2 <= N <= 10^18
 

Output
For each test case, output the case number first. Then output "Yes" if N is squarefree, "No" otherwise.
 

Sample Input
2
30
75
 

Sample Output
Case 1: Yes
Case 2: No
 

Author
hanshuai
 
題意:
n是否能被一個含有因子是一個平方數的數整出
能輸出no 不能輸出yes

[cpp] view plaincopy
/*一個數n能被一個數的平方整除  那麼這個數一定能被一個質數的平方整出 
如果能被一個偶數的平方整出 由於偶數=2*x 一定含有質數2 故能被質素2的平方整出
 假如 一個數能被 一個奇數的平方整除 奇數=質數*x 故能被質素的平方整出
對於本題數據較大 可以做如下處理
如果n>10^6
1 求出10^6內的所有質數 看n是否可以分解成這些質數某個的平方 如果可以輸出No
2 數據最大為10^18 當那麼最多存在一個數x使得  x*x整出n 因為n*n*n大於10^18
故對其開方 如果能開放 則輸出No  
 
思維擴展:
對於一個平方數 一定可以分解成某個質數的平方*某些質數
*/  
#include<stdio.h> 
#include<math.h> 
#include<string.h> 
int vis[1000000+5]; 
int prime[79000]; 
int cnt[79000+5]; 
int c; 
void get_prime() 

    int i,j,n,m; 
    c=0; 
    n=1000000; 
    m=(int)sqrt(n+0.5); 
    memset(vis,0,sizeof(vis)); 
    for(i=2;i<=m;i++)  
        if(!vis[i]) 
        { 
            for(j=i*i;j<=n;j+=i) 
                vis[j]=1; 
        } 
    for(i=2;i<=n;i++) if(!vis[i]) 
        prime[c++]=i; 

#include<stdio.h> 
int main() 

     int i,j,cas,flag,k; 
     __int64 n,m; 
     double num; 
     get_prime(); 
     scanf("%d",&cas); 
     for(k=1;k<=cas;k++) 
     { 
         scanf("%I64d",&n); 
          memset(cnt,0,sizeof(cnt)); flag=0;       
               for(j=0;j<c;j++) 
               { 
                   m=n; 
                   while(m%prime[j]==0) 
                   { 
                       m/=prime[j]; 
                       cnt[j]++; 
                       if(cnt[j]>=2) {flag=1;break;} 
                   } 
                   if(flag) break; 
               }       
          if(n>1000000) 
          { 
              num=sqrt((double)n);//這裡要注意 必須要加double  否則編譯錯誤 
             if(floor(num+0.5)==num) flag=1; 
          } www.2cto.com
          if(flag) printf("Case %d: No\n",k); 
          else printf("Case %d: Yes\n",k); 
     } 
     return 0; 

 


作者:hnust_xiehonghao

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved