Şimdi Ara

12 basamakli bir sayinin asal çarpanlarini bulma ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
633
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • ProjectEuler'in 3. sorusunu çözmek için şöyle bir kod yazdim ama en fazla 9 basamakli sayilar için çalışıyor

    600851475143 sayisinin asal çarpanlarini bulmak için ne yapmam gerekir ?

     
    #include <stdio.h>
    #include <conio.h>

    int main()
    {
    long int i=2;
    long int sayi=13195;

    while(i<=sayi)
    {
    while(sayi%i==0){
    sayi=sayi/i;
    printf("%d\n",i);
    }
    i++;
    }


    _getch();
    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi hystria61 -- 12 Mayıs 2013; 2:49:38 >



  • ilk while sayının kareköküne kadar döndürmeyi dene
  • ben çözmüştüm o soruyu.
    olay şu , ben elimdekisayi diye değişken oluşturdum ilk başta bu sayı 12 basamaklı. sonra her asal çarpanı bulduğumda elimdekisayi/=sonasalsayi şeklinde yapıyordum elimde ki sayı sürekli küçülüyordu yani.
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private bool asalmi(long sayi)
    {

    if(sayi==2)
    return true;
    for(long i=2;i<sayi-1;i++)
    {
    if (sayi % i == 0) // eğer kendinden önce ki bi sayıya kalansız bölünürse o zaman asal değil.
    { return false; } // asal değil.
    }

    return true;

    }

    private void Form1_Load(object sender, EventArgs e)
    {
    //asal çarpanlarını bulmak.
    long girilen = 60085147515543;//600851475143
    long elimdekisayi = girilen;

    //bi tane asal çarpanı bulunca.
    //döngüyü kır.yeni döngü oluştur.



    basla:
    while (elimdekisayi != 1)
    {
    if (listBox1.Items.Count>=1)
    {
    for (long z=Convert.ToInt16(listBox1.Items[listBox1.Items.Count-1]) ; z < elimdekisayi+1; z++)
    {
    if ((asalmi(z) == true) && (elimdekisayi % z == 0))
    { listBox1.Items.Add(z); elimdekisayi /= z; break; }
    }
    }
    else
    {
    for (long z = 2; z < elimdekisayi; z++)
    {
    if ((asalmi(z) == true) && (elimdekisayi % z == 0))
    { listBox1.Items.Add(z); elimdekisayi /= z; break; }
    }
    }

    goto basla;

    }


    }
    }
    }





  • quote:

    Orijinalden alıntı: {engineer}


    2. whilede senin dediğini yaptimki zaten ?
  • Kodunu düzelttim sadece, daha efficient algoritmalar var bu tip sorular için. Big-Oh notation nedir ne değildir , ordan başlamalısın

      
    #include <iostream>
    #include <math.h>

    using namespace std;

    int main(){
    long long num = 600851475143;
    long int dummy = 2;
    long long sqroot = sqrt (num);
    while(dummy <= (sqroot+1)){
    while(num%dummy == 0){
    num = num/dummy ;
    cout << dummy << " " ;
    }
    dummy++;
    }


    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi caut -- 12 Mayıs 2013; 19:51:00 >
  • ilk while i karekokunu alarakta denemiştimde çalışmamişti ama sayinin tipini long long yapinca calişti teşekkürler



    < Bu mesaj bu kişi tarafından değiştirildi hystria61 -- 12 Mayıs 2013; 20:31:43 >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.