10x10 Rastgele Oluşturulan Matriste Asal Olan Sayıları Bulma "C"

Serpenos

Kilopat
Katılım
15 Ağustos 2014
Mesajlar
3.257
Makaleler
2
Çözümler
5
Daha fazla  
Cinsiyet
Erkek
Profil Kapağı
1522193036
Merhaba. Sorum belli ve buradaki asıl problem sayıların rastgele oluşturulması. Şöyle bir kod buldum:
C:
#include <stdio.h>
#include <stdlib.h>
int asalKontrol(int);
 
int main(){
    int dizi[4][4];
    int x;
    for(int i=0; i<4; i++){
        for(int j=0; j<4; j++){
            printf("%dx%d)Sayi giriniz: ", i, j);
            scanf("%d", &dizi[i][j]);
            
        }
    }
    
    for(int i=0; i<4; i++){
        for(int j=0; j<4; j++){
            x = asalKontrol(dizi[i][j]);
        
            if(x == 1)
                printf("%dx%d:%d\n",i, j, dizi[i][j]);
            
        }
    }
 
    printf("\n");
    system("pause");
    return 0;
}
 
int asalKontrol(int sayi){
    
    int kontrol = 0;
    if(sayi < 2)
        return -1;
        
    for(int j=2; j<=sayi/2; j++){
        if(sayi % j == 0){
                kontrol = 1;
                break;
            }   
    }
    
    if(kontrol == 0)
        return 1;
    else
        return -1;
    
}

Ve buna benzer bir şeyler yaptım ama sayılar rastgele olunca asallıklarını nasıl bulacağıma beynim yetmedi. Yardım eder misiniz?

Ek olarak kendiniz yazacaksanız döngüler ve dizileri biliyorum sadece. Bilmediğim şeyler yazmazsanız sevinirim.
 
Öncelikle Sayının yarısına kadar değil kareköküne kadarki sayıları kontrol etmeniz yeterli.
Şimdi birisi çıkıp karekök çok maliyetli bir fonksiyon falan filan sacmalayacak onun için şimdiden açıklıyorum.

1.000.000 sayısının asal olup olmadığına bakıyoruz diyelim. Senin algoritmana göre tek tek 500.000'e kadar deneyecek.
Eğer karekök alıp öyle döngüye sokarsan sadece 1.000'e kadar kontrol edecek.

Biraz uğraşırsan döngüyü boş yere tek tek artırmak yerine 2 den sonra 2şer şer artırım yaparak daha az cycle ile işlemi halledersin.

Random sayı oluşturmak için time.h kütüphanesini ve rand() srand() fonksiyonlarını kullanabilirsin.
Örnekleri Stackoverflowda var.
 
Mantıklı çözüm yolu. Benim kavrayamadığım nokta ben sütun ve satır için 2 tane [10][10]luk dizi oluşturdum tamam. Ve eğer yanlış düşünmüyorsam bu sayılar her bir satır ve sütuna atanacak. [6][7] deki sayı 26 gibi mesela. Ben döngüde matrisin her bir [x][x]i için asallığı nasıl kontrol edeceğimi çözemedim sadece. Yani
for(i=0;i<=dizi[][];i++)
if(karekökle dediğinizi yapıp asallığı sağlama koşulu sağlanıyorsa) printf("blabla",blabla);

gibi yazamıyorum sanırım. Burada tıkandım.
 
Mantıklı çözüm yolu. Benim kavrayamadığım nokta ben sütun ve satır için 2 tane [10][10]luk dizi oluşturdum tamam. Ve eğer yanlış düşünmüyorsam bu sayılar her bir satır ve sütuna atanacak. [6][7] deki sayı 26 gibi mesela. Ben döngüde matrisin her bir [x][x]i için asallığı nasıl kontrol edeceğimi çözemedim sadece. Yani
for(i=0;i<=dizi[][];i++)
if(karekökle dediğinizi yapıp asallığı sağlama koşulu sağlanıyorsa) printf("blabla",blabla);

gibi yazamıyorum sanırım. Burada tıkandım.
Bkz: Nested Loops

Satır için ayrı döngü;
Sütun için ayrı döngü oluşturacaksınız

C:
int i,j;


for(i = 0; i < 10; i++)
{
    for(j = 0; j < 10; j++)
    {
        int temp  = matrix[i][j];
        if(isPrime(temp) != 0)
        {
            printf("%d is a Prime Number\n",temp);
        }
    }
}
 
Son düzenleme:
Paylaştığınız kodun main kısmındaki ikinci for döngüsü gibi yapacaksınız. i ve j olarak gösterilen iç içe iki değişken bütün matrisi gösterecek. Kod ilk for döngüsüne girdiğinde bütün x[0][j]’leri kontrol edecek ikinci for döngüsünde. Bittiği zaman x[1][j]’leri kontrol edecek ve bu tamamını kontrol edene dek devam edecek.
 
Kod:
//#include <math.h> gerektirir.

int isPrime(int number)
{
    int flag = 1, i;
    if(number > 2 && number % 2 == 0)
    {
        return 0;
    }
    for (i = 2; i <= sqrt(number); i+=2)
    {
        if(number % i == 0)
        {
            flag = 0;
            break;
        }
        if(i == 2)
        {
            i--;
        }
    }
    if(number >= 2)
    {
        return flag;
    }
    else
    {
        return 0;
    }
}
 
Paylaştığınız kodun main kısmındaki ikinci for döngüsü gibi yapacaksınız. i ve j olarak gösterilen iç içe iki değişken bütün matrisi gösterecek. Kod ilk for döngüsüne girdiğinde bütün x[0][j]’leri kontrol edecek ikinci for döngüsünde. Bittiği zaman x[1][j]’leri kontrol edecek ve bu tamamını kontrol edene dek devam edecek.
Dizileri bugün gördüm ve inanılmaz basit örneklerdi burada tıkandım ve dediğinizi anlayamıyorum :(

Kod:
//#include <math.h> gerektirir.

int isPrime(int number)
{
    int flag = 1, i;
    if(number > 2 && number % 2 == 0)
    {
        return 0;
    }
    for (i = 2; i <= sqrt(number); i+=2)
    {
        if(number % i == 0)
        {
            flag = 0;
            break;
        }
        if(i == 2)
        {
            i--;
        }
    }
    if(number >= 2)
    {
        return flag;
    }
    else
    {
        return 0;
    }
}

Hocam asal sayı bulmakta sorun yok. Ben dizilerdeki asal sayıları nasıl bulacağımı anlamadım. Rastgele 100 tane sayı verecek ben herhangi birisine i veya j diyemem ki.
 
Dizileri bugün gördüm ve inanılmaz basit örneklerdi burada tıkandım ve dediğinizi anlayamıyorum :(



Hocam asal sayı bulmakta sorun yok. Ben dizilerdeki asal sayıları nasıl bulacağımı anlamadım. Rastgele 100 tane sayı verecek ben herhangi birisine i veya j diyemem ki.
Siz neyi anlamadığınız bile anlamamış durumdasınız;


i ve j diye iki tane değişken tanımlayıp tüm matrixi dolaşacaksanız
i = 0 için 10 tane j, i = 1 için 10 tane j...
Toplamda 100 kere kontrol yapacaksınız.
Genel algoritma mantığı ve döngü bilginiz eksik.

attığım kod 10'a 10'luk matrix içerisindeki tüm asalları buluyor.
Dikkatlice incelerseniz nasıl yaptığımı anlama ihtimaliniz yüksek.

Hatta kafanız karışmasın diye önce Temp'e aktardım ondan sonra isPrime() fonksiyona gönderdim.
direkt olarak;
isPrime(matrix[i][j]) != 0 ? printf("prime\n") : printf("non prime\n");
şeklinde tek satıra bile indirgenebilir.
 
Son düzenleme:
Siz neyi anlamadığınız bile anlamamış durumdasınız;


i ve j diye iki tane değişken tanımlayıp tüm matrixi dolaşacaksanız
i = 0 için 10 tane j, i = 1 için 10 tane j...
Toplamda 100 kere kontrol yapacaksınız.
Genel algoritma mantığı ve döngü bilginiz eksik.

attığım kod 10'a 10'luk matrix içerisindeki tüm asalları buluyor.
Dikkatlice incelerseniz nasıl yaptığımı anlama ihtimaliniz yüksek.

Hatta kafanız karışmasın diye önce Temp'e aktardım ondan sonra isPrime() fonksiyona gönderdim.
direkt olarak;
isPrime(matrix[i][j]) != 0 ? printf("prime\n") : printf("non prime\n");
şeklinde tek satıra bile indirgenebilir.

İşiniz yoksa blokları birleştirip tam kodu atabilir misiniz? Ödevi kendim yapıp yanlışımı sormayı tercih ederim ama şuan bunu yapamıyorum.
C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
srand(time(NULL));
 float x;
 int matris[100][100],max,a,i,j;

for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
matris[i][j]=rand()%100;
printf("%d\t",matris[i][j]);
}
printf("\n");
}
max=0;

}


Bu şuan 10x10 random matris oluşturuyor tamam. Bundan sonra bir k değişkeni atayıp i ve j'nin bir eksiğine kadar döndürüp veya dediğiniz gibi bir yol izleyerek öyle mi bulacağım asalları?
C:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    
    srand(time(NULL));
    int i,j,k,m,matris[100][100];
    for (i=0;i<=10;i++){
        for(j=0;j<=10;j++){
            matris[i][j]=rand()%100;
            }
}
            for(k=2;k<=i-1;k++){
                for(m=2;m<=j-1;m++){
                    if (i%k!=0 || j%m!=0) printf("%d",i,j);
                }
            }
                
}


Burada ne yanlış var mesela ekrana 1 bastırıyor sürekli?
Tamam biraz daha çalıştım tek sorun asal bulamıyorum hala. Dizilerde her elemanı tek tek kontrol etmek için kontrol değişkeni atamam lazımmış sanırım. Ama nedenini anlamadım tam olarak. Bu kod çalışmıyor neden? Çalışmıyor derken matris çiziyor ama asal toplam diye satır bile oluşmuyor bırakın değer göstermeyi.
C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
    srand(time(NULL));
    int i,j,k,toplam=0,matris[100][100];
    for(i=1;i<=10;i++){
        for(j=1;j<=10;j++){
            matris[i][j]=rand()%100;
            printf("%d\t",matris[i][j]);
        }
        printf("\n");
    }
    for(k=2;k<=matris[i][j]-1;k++){
    if(matris[i][j]%k!=0)
    
     toplam=toplam+k;
    printf("Asal toplam: %d",toplam);
    
}
    
}
Hallettim. Çözüm:
C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
    srand(time(NULL));
    int matris[10][10],i,j,k,toplam=0,flag;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
        
        matris[i][j]=rand()%10;
        printf("%d ",matris[i][j]);
        flag=0;
        for(k=2;k<matris[i][j];k++){
            if(matris[i][j]%k==0){
                flag=1;
                continue;
            }
        }
        if(flag==0){
            toplam+=matris[i][j];
        }
    }
        
        printf("\n");
    }
    printf("\n asal toplam= %d",toplam);
}
 
Son düzenleme:
10.000 basamaklı bir sayının karekök alma çözüm süresi 7 dk.
(Intel Core 2 Duo CPU T5550 1.83 GHz 2 GB 32 Bit)
Bu algoritmanın hızı hakkında bilginizi paylaşabilir misiniz? Teşekkür ederim.
 

Yeni konular

Geri
Yukarı