Çözüldü C [Warning] overflow in implicit constant conversion [-Woverflow] uyarısı

  • Konuyu başlatan soon
  • Başlangıç Tarihi
  • Mesaj 10
  • Görüntüleme 2.990
Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

soon

Hectopat
Katılım
16 Şubat 2021
Mesajlar
581
Çözümler
3
Merhaba, iyi forumlar.
En büyük asal sayıyı bulan kod parçasında sayi değişkenine büyük değerler atayınca bu hatayı alıyorum, nasıl düzeltebilirim?
Kodu bırakıyorum.

c.png
 
Çözüm
Bu soru bana bir yerden tanıdık geliyor ama...

C:
long biggestPrime(long number)
{
    long div = 2, largestDiv = -1, curr = number;
    do
        if (curr % div == 0)
        {
            curr /= div;
            if (div > largestDiv)
                largestDiv = div;
            div = 2;
        }
        else
            div = div == 2 ? 3 : div + 2; // Check only odd numbers (except 2)
    while (curr != 1);
    return largestDiv;
}

Sorununuz kaynağı Integer Overflow. Signed 32 bit Integer max değeri 2,147,483,647'dir.
Long için yazmamıştım. Ki bence gerek yok. O kadar büyük sayıların en büyük asal bölenleri bir işinize yarayacağını sanmıyorum.

Normalde bende bu değerler ile uğraşmam ama soru bu şekilde olduğu için merak ettim bu uyarının çözümünü.

Adsız.png


Attığınız kod [Error] sys/wait.h: no such file or directory hatası veriyor, sanırım Windows'tan kaynaklı.

Aklıma şöyle basit bir algoritma geldi ama doğruluğunu bol bol test etmek lazım.
Algoritmayı şöyle:
2'den başlıyoruz ve sayı 2'ye tam bölündüğü sürece 2'ye bölüyoruz.
Bölünememeye başladığında 3'ü deniyoruz ve sürekli bölünemediği sürece tek sayılar üzerinde devam ediyoruz. En son tam bölen sayı bize sonucu veriyor.
İstiyorsan tüm bölenleri bul çarp ve doğruluğunu ispatla programın. Ben denemedim aklıma geldi böyle çözüm sundum.

[CODE lang="c" title="En büyük asal bölen"]#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
signed long long sayi = 5646676815, devider = 2;

while (!sayi % devider)
sayi /= devider;
devider++;

while (sayi != 1)
{
if (sayi % devider == 0)
sayi /= devider;
else.
devider += 2;
}

printf("%llu \n", devider);
return 0;
}[/CODE]

Doğru sonuçlar veriyor hocam fakat algoritmanın tam olarak mantığını anlayamadım.
Düzenleme, biraz araştırınca anladım teşekkür ederim.

1617709471375.png


Bu soru bana bir yerden tanıdık geliyor ama...

Archived Problems - Project Euler burada denk gelmiş olabilirsiniz hocam, 3.soru.

Sorununuz kaynağı ınteger overflow. Signed 32 Bit ınteger Max değeri 2, 147, 483, 647'dir.

Anladım, teşekkür ederim.
 
Son düzenleme:
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı