Çö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.997
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.
Kodu bırakıyorum.
Kodu öyle bırakmıyoruz. Aşağıdaki gibi bırakıyoruz.

Kodu yazıp o parantezleri düzeltmekle uğraşacak arkadaş varsa şimdiden kolay gelsin.

 

Buraya bakarsan C dilinde integer değişkenlerin hangi aralıkta veri alabilidklerini görebilirsin. Senin yazdığın sayı için daha büyük veri tipleri kullanman gerek.

Yazdığın sayıya baktımğımda 12 basamaklı yani signed long long int istediğin sayıya uygun olabilir.
 

Buraya bakarsan C dilinde integer değişkenlerin hangi aralıkta veri alabilidklerini görebilirsin. Senin yazdığın sayı için daha büyük veri tipleri kullanman gerek.

Yazdığın sayıya baktımğımda 12 basamaklı yani signed long long int istediğin sayıya uygun olabilir.
Sonsuz döngüye giriyor hocam bu seferde .

C:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

     int eb=1,k,sayi=600851475143;
     int i=sayi;
    
    while(i>=2){
        i=i-1;
    int control=0;
       if (sayi%i==0){
           for (k=2;k<i;k++){
               if(i%k==0)
               control++;
               else;
           }
          
           if (control==0){   
       if (eb<i)
           eb=i;
       else
       eb =eb;
    }
  }
}
    
   printf ("%d",eb);
    return 0;
}
Kodu öyle bırakmıyoruz. Aşağıdaki gibi bırakıyoruz.

Nasıl bırakacağımı öğrenmiş oldum sayenizde, teşekkür ederim.
 
Elinizdeki kod sayi değişkenindeki sayının kendisinden küçük en büyük asal çarpanını buluyor. Ve gördüğüm kadarıyla çalışıyor. Ufak hatalar falan vardı. Düzelttiğim hali böyle.

Kod:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

    int eb = 1;
    int sayi = 28;
    int i = sayi;
    int control = 0;
    
    while(i >= 2){
        i--;
        control = 0;
        
        if (sayi % i == 0){
            for (int k = 2; k < i; k++){
                if(i % k == 0){
                    control++;
                    break;
                }
            }
            
            if (control == 0 && eb < i){   
                eb = i;
            }
        }
    }
    
    printf ("%d\n", eb);
    return 0;
}
 
Sonsuz döngüye giriyor hocam bu seferde

O tamamen algoritmanın yavaşlığından. Yazdığın algoritman n^2 de çalışıyor yani input sayının karesi kadar dönüyor. Daha iyi bir algoritma ile bu süreyi azaltman gerek. Asal sayı bulma algoritması olarak Sieve of eratosthenes algoritmasına araştırmanı ve göz atmanı öneririm.

Eğer hayır yok ben yapacağım dersen de aklıma gelen kçük iyileştirmeleri yapabilirsin. Örneğin 2 harici çift sayı yoktur o yüzden tüm sayıları gezmek yerine sadece tek sayıları gezebilirsin.
 
Elinizdeki kod sayi değişkenindeki sayının kendisinden küçük en büyük asal çarpanını buluyor. Ve gördüğüm kadarıyla çalışıyor. Ufak hatalar falan vardı. Düzelttiğim hali böyle.

Kod:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {

int eb = 1;
int sayi = 28;
int i = sayi;
int control = 0;

while(i >= 2){
i--;
control = 0;

if (sayi % i == 0){
for (int k = 2; k < i; k++){
if(i % k == 0){
control++;
break;
}
}

if (control == 0 && eb < i){
eb = i;
}
}
}

printf ("%d\n", eb);
return 0;
}

Hocam teşekkür ederim hatalarımı düzelttiğiniz için lakin büyük sayılarda hala aynı uyarıyı veriyor.
O tamamen algoritmanın yavaşlığından. Yazdığın algoritman n^2 de çalışıyor yani input sayının karesi kadar dönüyor. Daha iyi bir algoritma ile bu süreyi azaltman gerek. Asal sayı bulma algoritması olarak sieve of eratosthenes algoritmasına araştırmanı ve göz atmanı öneririm.

Eğer hayır yok ben yapacağım dersen de aklıma gelen kçük iyileştirmeleri yapabilirsin. Örneğin 2 harici çift sayı yoktur o yüzden tüm sayıları gezmek yerine sadece tek sayıları gezebilirsin.

Sieve of eratosthenes algoritmasını araştıracağım, iyileştirmeleri de düşünüp tekrar çözmeye çalışacağım hocam teşekkür ederim yardımınız için.
 
Hocam teşekkür ederim hatalarımı düzelttiğiniz için lakin büyük sayılarda hala aynı uyarıyı veriyor.
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. Algoritma için programı yazmanızı kabul edebilirim ama 32 bitten büyük sayılar için uğraşmanızı anlamıyorum.
Bu kod bende çalışıyor ama çok yavaş çalışıyor. Aslında olay büyük sayı olduğu için yavaş. Tamamına gitmek yerine kareköküne gitmek etki eder ama yine de hissedilebilir bir yavaşlık olur diye düşünüyorum.
Kod:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>

int main(){
    long long int eb = 1;
    long long int sayi = 2500000000;
    long long int i = sayi;
    int control = 0;
    
    while(i-- >= 2){
        
        control = 0;
        
        if (sayi % i == 0){
            for (long long int k = 2; k < i; k++){
                if(i % k == 0){
                    control++;
                    break;
                }
            }
            
            if (control == 0 && eb < i){   
                eb = i;
            }
        }
    }
    
    printf ("%lld\n", eb);
    return 0;
}
 
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]
 
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.
 
Son düzenleme:
Çözüm
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ı