2014-03-06 37 views
4

我試圖解決這個問題http://www.spoj.com/problems/PRIMEZUK/SPOJ素數猜想PRIMEZUK

#include<iostream> 
#include<cstdio> 
#include<math.h> 
#define l long long 
using namespace std; 
l chk(l a) 
{ 
    for(int i=2;i<=sqrt(a);++i) 
    { 
     if(a%i==0) 
     { 
      return a/i; 
     } 
    } 
    return 0; 
} 
main() 
{ 
// freopen("in.txt","r",stdin); 
    int t,n,a; 
    l prod=1,flag; 
    //t=inp(); 
    cin>>t; 
    for(int j=1;j<=t;++j) 
    { 
     cin>>n; 
     //n=inp(); 
     if(n==0) 
     prod=-1; 
     else 
     prod=1; 
     while(n--) 
     { 
      cin>>a; 
      //a=inp(); 
      prod*=a; 
     } 
     ++prod; 
     flag=chk(prod); 
     if(!flag) 
     printf("Case #%d: %lld\n",j,prod); 
     else 
     printf("Case #%d: %lld\n",j,flag); 
    } 
} 

我得到正確的答案樣本測試案例,但whne我提交我得到錯誤的答案...任何提示???

+0

有stackexchange [代碼審查]中多了一個網站(http://codereview.stackexchange.com/)......對於這些問題 – HadeS

+2

的#define升長長的最適合的地方 - 這是一個犯罪針對編程的攻擊 – gnasher729

回答

2

你得到錯誤的答案,因爲「返回/我」也可能返回你應該檢查是否非黃金number.So「返回/ i」是黃金或不..

試試這個.. 。

#include<bits/stdc++.h> 

long long int check(long long int a)//Function to check whether a number is prime or not 
{ 
    long long int i,k; 
    k=sqrt(a); 
    for(i=2;i<=k;++i) 
    { 
     if(a%i==0) // if not prime 
      return check(a/i); //then find greatest prime 
    } 
    return a; 
} 

int main() 
{ 
    int j=1,t; 
    long long int n,a,prod,flag; 
    scanf("%d",&t); 
    while(t--) 
    { 
     scanf("%lld",&n); 
     if(n==0) 
      prod=-1; 
     else 
      prod=1; 
     while(n--) 
     { 
      scanf("%lld",&a); 
      prod*=a; 
     } 
     ++prod; 
     printf("Case #%d: %lld\n",j,check(prod)); 
     j++; 
    } 
    return 0; 
} 
+2

首先,歡迎來到SO。你應該修改一些代碼格式。也請刪除所有冗餘信息 - 您在開始和結束時的簽名。而是請更新您的個人資料信息。同時避免使用全部大寫字母。我們不需要互相呼喊:)我們應該儘可能保持答案的清晰和直接。謝謝。 – slawek

+0

如果你做了以上所有的事情,我會投你的答案。我檢查過spoj,你的代碼通過並被接受。 – slawek

+0

我認爲這個答案比寫作風格更受歡迎..謝謝.. –