Tam Sürümünü Görmek İçin : asal sayilar
yilmazcan
30/05/2005, 12:04
Arkadaslar, c'de bir sayiyi asal carpanlarina nasil ayirabiliriz? elinde kod olan varsa yardimci olursa memnun olurum.... mail adresim qayra@hotmail.com
yildiz teknik üniversitesi endüstri mühendisliği mi ? 8)
http://www.troubleshooters.com/codecorn/primenumbers/primenumbers.htm#_Using_Only_Primes_As_Divisors
Bu linkteki algoritmalara bir bak. Ben bu sayfadaki ilk ornegi iki syntax hatasini duzelttikten sonra asagidaki sekli ile derlerdim performans dusuklugunu saymazsan gayet iyi calisiyor. Tabi bu algoritma sadece girilen sayidan kucuk olan butun asal sayilari donuyor sadece. Ama bundan sonrasinin cok kolay olmasi lazim degil mi?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
typedef unsigned long bignum;
void printPrime(bignum bn)
{
static char buf[1000];
sprintf(buf, "%ull", bn);
buf[strlen(buf) - 2] = '\0';
printf("%s\n", buf);
}
void findPrimes(bignum topCandidate)
{
bignum candidate = 2;
while(candidate <= topCandidate)
{
bignum trialDivisor = 2;
int prime = 1;
while(trialDivisor * trialDivisor <= candidate)
{
if(candidate % trialDivisor == 0)
{
prime = 0;
break;
}
trialDivisor++;
}
if(prime) printPrime(candidate);
candidate++;
}
}
int main(int argc, char *argv[])
{
bignum topCandidate = 1000;
if(argc > 1) topCandidate = atol(argv[1]);
findPrimes(topCandidate);
return 0;
}
#include<iostream>
#include<cmath>
#include<cassert>
#include<vector>
using namespace std;
class prime
{
public:
vector<int> primeList;
prime(){ primeList.push_back(2);}//ilk asal 2 dir
bool isPrime( int n )// n asal mi ?
{
assert( n > 2 );
int bound = sqrt(n) ;
for ( int i = 2 ; i < bound; i++){
if ( n % i == 0 ) return false;
}
return true;
}
int i_ndPrime( int order ) // i inci siradaki asal
{
assert(order>0);
//daha onceden hesaplandi ise hesaplama
if ( primeList.size() >= order ) return primeList[order-1];
int lastPrimeOrder = primeList.size();//kac adet asal hesapladik
int lastPrime = primeList.at(lastPrimeOrder-1);//sonuncu asal
while( lastPrimeOrder < order )
{
if ( ! isPrime(++lastPrime) ) continue ;
primeList.push_back(lastPrime);
lastPrimeOrder++;
}
return lastPrime;
}
};
int main()
{
prime a;
cout<<a.i_ndPrime(100000);
cout<<"resolved"<<endl;
cout<<a.i_ndPrime(99999);//hizli sonuc
}
performansı arttırmak için
bir depo kullanılabilir
böylece önceden hesaplanan asallar için tekrar işlem yapılmaz..
yukarıdaki fonsiyona bir ekleme hızı daha da arttırabilir.
bool isPrime( int n )
{
//bilineneler icin
assert( n > 2 );
int Ubound = primeList.size() ;
for ( int i = 0 ; i < Ubound ; i++)
{
if ( n % primeList[i] == 0 ) return false ;
}
///sonrasi icin
Ubound = sqrt(n)+1;
int Lbound = primeList[primeList.size()-1];
for ( int i = Lbound ; i < Ubound; i++){
if ( n % i == 0 ) return false;
}
return true;
}
bismillahirrahmanirrahim...
ben mi yannış okudum... arkadaşımız bir sayının asal çarpanlarını nasıl bulurum demiyor mu?..
şimdi her çarpanın birde kuvveti var.. burdan std:: pair gibi bir yapı kullanmamız gerektiği mi sonucu çıkıyo... yannız birden fazla çarpan var.. o zaman biz std::map i kullanalım.. carpanlar ı da anahtar olarak kullanırız...
peki sayının carpanlarını nası bulurus... bunun için ilköğretim matematiğinde gördüğümüs çarpanlara ayırma yöntemini kullanabilir miyis... verilen sayi yi 2 den başlayarak boleriz.. en son 2 ye bolunmediği taktirde 3 e geçeriz.. bölebildiğimiz kadar 3 e sonra 4 e, 5 e vs vs...
eğer zi de map kullanamam ki diyosan, map kadar yetenekli olmasa da, böle armutça bişi yazsak heralde işimizi görür.... :
typedef struct
{
unsigned int carpan;
unsigned int kuvvet;
} Carpanlar;
unsigned int kacTane = 1;
Carpanlar * carpanlar = (Carpanlar *) malloc(sizeof(Carpanlar) * kacTane);
neyse her ne kadar çok ta bi işe yaramasa benden bu kadar...
birsaniye... şimdiye kadar bizi müzik diyerek kandırıkları şeyleri unutun.. ve gerçekte müziğin ne olduğunu öğrenmek istiyorsanız ... Haggard dinneyin... O ne ki ? ... almanyanın bağrından kopmuş, klasik müziği günümüzün gerçek müziğiyle birleştiren dünyanın en rahatsız orkestra sı... onlar bu dünyaya gerçek müziğin ne olduğunu göstermek için geldiler.. peki sahte müzik nasıl oluyor... şöyle oluyor... pop un sonuna müzik kelimesini eklediğiniz zaman, sahte müziği yaratmış oluyorsunuz... adı üzerinde popüler.. bugün var yarın yok.. müzikteki derin güzelliği göremeyen insanların yüzeysel bakışları... sadece odun sesli bir vokal ve arkasından dum tıs dum tıs sesli hiç değişmeyen bir müzik.. bugüne kadar yüzlerce enstrümandan bir tanesini bile bulundurmayan müzik... hep seni cok seviyorum, kaçma gitme biyere gibi basit cümlelerin olduğu müzik... Haggard mı? peki nedir bu haggard... piano, viola, violine, violoncello, crumhorn, klarnet, flauto, tympani, cembalo... gibi enstrümanlar haggard ın kullandıklarından sadece birkaçı... bunun yanında büyüleyici bayan vokaller (alto ve soprano) ve müthiş tenor, baritone, grunt erkek vokaller.. ve bunnarın müthiş uyumu sonucunda oluşan müzik.. işte haggard için çok kısa bir açıklama okudunuz...
ve haggard ı tek bir şarkıyla sevmiştim...ve başka hiçbir şarkı dinlemeden sadece o şarkıyı 1 ay boyunca dinnedim (taaki ikinci bir haggard şarkısı bulana kadar) (günde en az 2-3 saat müzik dinneyen birisiyim)...
neden bu kadar şeyi yasdım.. bunun yeri burası mı?... bilmem... arkadaşa cevap yazarken fon da haggard çaldığı için... yazmak içimden geldi...
bismillahirrahmanirrahim...
ben mi yannış okudum... arkadaşımız bir sayının asal çarpanlarını nasıl bulurum demiyor mu?..
...
:) performans filan derken göremedim ben onu..
benim kodun main kısmına bir döngü ekledim halloldu..
int main()
{
prime a;
int number = 3*19*101;//carpanalarina ayirilacak sayi
int index=1; // index inci asal bolermi ?
while ( number != 1 )
{
int count= 0; // us degeri
int temp = a.i_ndPrime( index );
while ( (number % temp == 0) && (number!=1) )
{
number = number/temp ;
count++;
}
if ( count ) cout<<temp<<" ^ "<<count<<" ";
index++;
}
}
aslında senin sunduğun çözüm güsel ama arkadaşın pek işini görmez gibi geliyo..
çünkü :
Arkadaslar, c'de bir sayiyi asal carpanlarina nasil ayirabiliriz? elinde kod olan varsa yardimci olursa memnun olurum.... mail adresim qayra@hotmail.com
burdan da anlaşılacağı gibi arkadaşımızın ödevlerle ilgili bir sorunu var...
ve bir kişi daha bana bunu sormuştu...
hoca nın şartları :
en az 1 pointer kullanan fonksiyon olacak...
cikti 2*2*3*5 şeklinde olacak...
vs vs vs...
yildiz teknik üni. endüstri müh. ders hocası : elif kongar... (muhtemelen) 8)
ve bu ders zi dersi.. zi plas plas değil.. 8)
ya normalde arkadaşa yardım etmek isterdim ama.. daha önce böyle bi olayda ödevin çözümünü verdiğim kişi nin birdaha ceviz forum a uğramadığını gördüm (kişinin profilindeki son aktivite zamanı ile yazdığı teşekkür mesajı tarihi çakışıyordu...)
myavuzselim
31/05/2005, 04:35
En iyisi mesela 1000000'a kadar olan asal saylari bir dosyaya yazmak, daha sonra oradan okumak.
Bu ödev hangi ünide verildi merak ettim. Geçende bi arkadaş bana arkadaşının ödevini maille atmıştı, arkadaşının bu ödevi vermezse finale giremeyeceğini çok önemli olduğunu söylemişti, ben de yapmıştım. Sanırım sen de onunla aynı üniversitedensin. Hatta pazartesi final varmış galiba. Neyse sanırım zamanı geçti ben programı yazayım buraya. Ödevin şartlarında main dahil en az 2 fonksiyon kullanılacak deniyordu ve kullanılırken değişken adresini alıp işlem yapacak şeklindeydi. İşte ödev :
#include <stdio.h>
// Sayının asal sayı olup olmadığını kontrol eden fonksiyon.
// Sayı asal ise 1 döndürür, asal değilse 0 döndürür.
short int asal_kontrol(int *);
// Sayıyı çarpanlarına ayırıp, çarpanları ekrana yazdıran fonksiyon.
void carpanlara_ayir(int *);
int main()
{
int sayi=0;
while (sayi<=0)
{ // sayi değişkeni 0 dan büyük olduğunda döngüden çıkar.
printf("Lutfen 0'dan buyuk bir tamsayi yazin : ");
scanf("%d", &sayi);
if (sayi<=0) // 0 veya 0'dan küçük bir değer girildiğinde hata ver
printf("0 veya 0'dan kucuk bir tamsayi girdiniz.\n");
}
if (asal_kontrol(&sayi)) // Asal sayı olup olmadığını kontrol et
printf("Girdiginiz %d sayisi asal sayidir.",sayi);
else
{// Asal sayı değilse çarpanlarına ayır
printf("%d sayisinin carpanlari : ",sayi);
carpanlara_ayir(&sayi);
printf(" olarak bulunmustur.");
}
printf("\n");
return 0;
}
short int asal_kontrol(int *ptrsayi)
{
int bolen;
short int durum=1;
for (bolen=2; bolen<*ptrsayi; bolen++)
if (*ptrsayi%bolen==0)
durum=0;
if (*ptrsayi==1) // 1 bir asal sayı değildir.
durum=0;
return durum;
}
void carpanlara_ayir(int *ptrsayi)
{
int carpan=2;
if (*ptrsayi==1)
printf("1");
while (*ptrsayi>1)
{
if (*ptrsayi%carpan==0)
{
*ptrsayi /= carpan;
if (*ptrsayi==1)
printf("%d",carpan);
else
printf("%d*",carpan);
}
else
carpan++;
}
}
Hatta ödevin kendisi de şuydu tekrar buldum.
######################
Girilen bir tamsayının sıfırdan büyük olup olmadığını kontrol eden, değil ise programın çalışmasına izin vermeyen ve tekrarlı şekilde doğru girişi almaya çalışan bir program yazın.
Program girilen sıfırdan büyük bir tamsayının asal sayı olup olmadığını araştıracaktır.
Kullanıcı tarafından girilen sayı asal ise ekran
“Girdiginiz 7 sayısı asal sayıdır”
gibi (değişik uyarı mesajları öğrenci tarafından kullanılabilir) uyarı mesajı
görüntülemelidir.
Yazacağınız program girilen sayı asal değil ise bu sayıyı en küçük çarpanlarına ayırmalıdır.
Örneğin : 18 sayısının çarpanları : 2*3*3 olarak bulunmustur şeklinde uyarı mesajı görüntülemelidir.
Programınızda “main” fonksiyonu dahil olmak üzere en az iki adet fonksiyon bulunmalıdır.
Program yazımında Referansla çağırım kullanılması gerekmektedir.
valla nediyim bu hocalara,
bazen yeni başlayacak olanlar soruyor,
bu tarz şeylerde tavsiye veremiyorum
(seviyemi aşar diye)
o kadar sık karşılaşır oldum ki..
en iyisi link veriyim: okutun hocanıza:)
http://www.research.att.com/~bs/new_learning.pdf
5 Summary
We want our C++ programs to be easy to write, correct, maintainable, and acceptably efficient.
To do that, we must design and program at a higher level of abstraction than has typically been done with C
and early C++.
Through the use of libraries,
this ideal is achievable without loss of efficiency compared to lowerlevel styles.
Thus, work on more libraries, on more consistent implementation of widely-used libraries
(such as the standard library), and on making libraries more widely available can yield great benefits to the
C++ community.
Education must play a major role in this move to cleaner and higher-level programming styles.
The C++ community doesn’t need another generation of programmers who by default use the lowest level of
language and library facilities available out of misplaced fear of inefficiencies.
Experienced C++ programmers
as well as C++ novices must learn to use Standard C++
as a new and higher-level language as a matter
of course and descend to lower levels of abstraction only where absolutely necessary. Using Standard C++
as a glorified C or glorified C with Classes only would be to waste the opportunities offered by Standard
C++. Bjarne Stroustrup
cpa kardeşim aynen öyle...
@mr1yh1 :
+1
ben zati uni deki birsürü hocayı annamamışımdır (tek tük çok iyiler çıkıyo)... ben hazırlıktayım.. vize de wedding day (düğün günü) kutlamaları ile ilgili 150-180 kelime arası yazı yazın dediler... lan benimkinin türkçesi bile 30 kelime tutmuyodu... anca 20-30 kelime arası bişi yazıp vermiştim... işte dangalak elle tutulmaz ödevler, sorular vs vs.. işte uni bu...
Da Vinci
05/06/2005, 23:36
eke asal çarpan ayırıcı programımı koydum.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.