Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
2 beğenilme 0 beğenilmeme
367 kez görüntülendi
Ulam spiralini cizen bir kod paylassiniz.
Veri Bilimi kategorisinde (1.6k puan) tarafından  | 367 kez görüntülendi
Beğeneyimde,ne olduğunu anlamışım gibi görünsün :)
sayma sayilarini spiral seklinde

 7    8    9    10

 6    1    2    11

 5    4    3    12

 16  15  14  13

yazip asallari boyayinca ulam spiralini cizmis oluyorsun. Gec oldu ama guc olmadi

1 cevap

0 beğenilme 0 beğenilmeme

Soyle bir cozumum var c dilinde

 

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

// kaca kaclik resim yapicaz?
#define LEN (1023)

// Resimi icine kaydedecegimiz dizi
int32_t izgara[LEN][LEN] = {0};


long int
sifir_bul (long int limit, char *sayilar, int baslama_indeksi)
{				// baslama indeksinden itibaren bir dizinin icinde ilk sifiri verir isaretlenmis sayiyi bulmak icin fonksiyon

  int ret = -1;
  for (long int ctr = baslama_indeksi; ctr < limit; ctr++)
    {
      if (sayilar[ctr] == 0)
	{
	  ret = ctr;
	  break;
	}
    }
  return ret;
}

char*
asallari_bul (long int limit)
{
  char *sayilar = calloc (limit, sizeof (char));	// bir tane dizi olustur dizinin n indeksindeki deger bize n-2 nin asal olup olmayacagini soyleyecek
  if (sayilar == NULL)
    {
      printf ("alloke edemedi kapaniyorum");
      exit (0);
    }
  long int indeks = 0;

  while (indeks != -1)
    {				// isaretlenmemis sayi kalmayana kadar yap
      long int asal = indeks + 2;	//
      for (long int temp = indeks+2; temp < limit; temp = temp + asal)
	{
	  sayilar[temp] = 1;	// sayiyinin kaylarini isaretle
	}
      indeks = sifir_bul (limit, sayilar, indeks+1);	// isaretlenmemis ilk sayiyi bul     
    }
  return (sayilar);	
}



int main(){
   
    
    int32_t c = 0;
    int32_t x= (LEN / 2)-1 ;
    int32_t y = (LEN / 2)-1 ;
    int32_t xmax = 2;
    int32_t ymax = 1;
    int j = -1;
    int adim = 0;
    char* asallar = asallari_bul(LEN*LEN + 2);    
    izgara[x][y] = c++;
    y=y+1;
    izgara[x][y] = c++;
    
    while(c < LEN*LEN){
        j *=-1;
        adim = 0;
        while(adim < ymax && y < LEN && y >= 0 && c < LEN*LEN){
            y = y+j;
            izgara[x][y] = asallar[c++] == 0 ? 255 : 1; // asal ise beyaza boya degil ise siyaha
            //izgara[x][y] = c++; // buradaki commenti kaldirirsaniz elinize spiral sayilar gelecek
            adim++;
        }
        ymax += 1; 
        adim = 0;
        while(adim < xmax && x < LEN && x >= 0 && c < LEN*LEN){
            x = x+j;
            izgara[x][y] = asallar[c++] == 0 ? 255 : 1 ; // // asal ise beyaza boya degil ise siyaha
            //izgara[x][y] = c++; // buradaki commenti kaldirirsaniz elinize spiral sayilar gelecek           
            adim++;
        }
        xmax += 1;
    }

    //sayi spiralini yazdirmak isterseniz burayi commenti kaldirin
    
    //for(int i = 0 ; i < LEN ; i++){
    //    for(int j = 0 ; j < LEN ; j++){
    //         printf(" %-4d ",izgara[i][j]);           
    //    }
    //    printf("\n");
    //} 

    
    //resmi kaydetmek icin dosya olustur
    FILE * fp;
    fp = fopen("ulam.pgm", "wb");

    //dosyanin resim oldugunu belirten "sihirli" baslangic 
    fprintf(fp, "P5\n %s\n %d\n %d\n %d\n", "", LEN, LEN,
            255);
    
    fwrite(izgara, sizeof(izgara), 1, fp);
    fclose(fp);
    free(asallar);
    
    return 0;
}

 

Sonucu da soyle gorunuyor

 

Not: Site ppm formatini kabul etmedigi icin jpg ye cevirdim.

(1.6k puan) tarafından 
20,193 soru
21,723 cevap
73,248 yorum
1,866,775 kullanıcı