2014-10-27 28 views
-4
給定數目

基本上我試圖做的是插入代表除數數量的整數k,然後找到所有的K除數從1-100000計數正整數與除數

#include <stdio.h> 

int main(void) 
{ 
    int k, x = 1, y = 100000, divisor, count; 

    printf("Enter the target number of divisors:\n"); 
    scanf("%d", &k); 



    for (divisor = 0; divisor <= 1; divisor++) 
     if (x % divisor == 0 && y % divisor == 0) 
      count++; 

    printf("There are %d numbers between 1 and 100000 inclusive which have exactly %d divisors\n", k, divisor); 

    return 0; 
} 
號碼

但是我似乎無法做到這一點,請幫助我,因爲我對編程場景相當陌生,並且沒有在其他地方找到答案。

+1

輸入'k'的值是什麼意思? – BLUEPIXY 2014-10-27 12:29:51

+0

@BLUEPIXY我們正在搜索的整數除數的數量? – 2014-10-27 12:30:39

+3

@IvayloStrandjev它將被替換而不被使用。 – BLUEPIXY 2014-10-27 12:31:58

回答

2

有,指出一個定理,如果你有canonical representation of an integer是一個 b *一個 b ...一個ňb ñ那麼該整數的除數爲(b + 1)*(b + 1)...(b n + 1)。

現在你已經有了這個定理,你可以稍微修改Eratosthenes的篩子,以規範的形式得到所有整數達到100000。

下面是一些代碼,它代表修改過的伊洛斯科涅斯的篩子。

const int size = 100000; 
int devs[size + 1]; 
void compute_devs() { 
    for (int i = 0; i < size + 1; ++i) { 
    devs[i] = (i%2 == 0) ? 2 : 1; 
    } 

    int o = sqrt(size);  
    for (int i = 3; i <= size; i += 2) { 
    if (devs[i] != 1) { 
     continue; 
    } 
    devs[i] = i; 
    if (i <= o) { 
     for (int j = i * i; j < size; j += 2 * i) { 
     devs[j] = i; 
     } 
    } 
    } 
} 

調用compute_devs後開發者的價值將每個數字的最大素因子的值存儲多達大小。我會把剩下的任務留給你,但是讓這個數組變得非常簡單。