Tübitak Bilgisayar Olimpiyat sorusu çözemedim.

Kodla Büyü

OK_FsM_Han

Üye
Mesajlar
5
1 den 100.000(yüz bin) kadar olan tamsayıların kaçtanesinin rakamları toplamı 7 dir?
Yardımcı olmanızı rica ediyorum. Kolay gelsin ben çok ugraştım. Matematikcileirmizde pek birşey anlamadı:D
 
Yesil26' Alıntı:
Sayısal analiz diye bir ders vardı ünv de basic yada C de kod yazarak çözülür ancak defter kalemle zor.
hiçbir elektronik cihaz veya karalama kağıdı bile kullanmak yasak...

Bu olimpiyatlarda hep fenliseleri kazanıyor ama bizde 8.sınıfla girecez bu sene bakalım ne olacak.:p
 
Böyle zeka sorusumu olur ya. Neresi zeka gerektiriyor bu sorunun. Delphide 5dk yapılır bunu hesaplayan program.
 
7
70
700
7000
70000
61
610
6100
61000
16
160
1600
16000
52
520
5200
52000
25
250
2500
25000
34
340
3400
34000
43
430
4300
43000
rakamları toplatan programı; a b c d e f yi toplatıp bir döngüye aktaracağız eğer 7 ise saydıracağız
 
100000/8 mi acaba ?
0
1
2
3
4
5
6
7------
8
9
10
11
12
13
14
15
16---- 8 sayı sonra
17
...
25----8 sayı sonra
...
34-----8sayı sonra
üç hanelilere bakmadım ama
 
vb6.0 için aşağıdaki gibi bir kod yazdım ama sayı 100000 olunca bilgisayarı biraz kasıyor. geçte olsa sonuç veriyor
Kod:
For i = 1 To 100000
    basamaksayisi = Len(i)
        For k = 1 To basamaksayisi
            basamaktop = basamaktop + Mid(i, k, 1)
        Next k
    If (basamaktop = 7) Then
        geneltop = geneltop + 1
    End If
    If (basamaktop <> 7) Then
        basamaktop = 0
    End If
Next i
MsgBox (geneltop)
 
7
.
.
16
.
.
25
.
.

34
.
.
43
.
.
....
106
...
304
...
şeklinde 9 artarak gidiyor. bir formül vardı.terim sayısı ile ilgili

terim sayısı=[(son terim - ilk terim) / Artış miktarı] + 1

=[(100000 - 1) / 9 ] + 1

= 11112
 
arkadaşlar 80-100 arası yada 170-200 arası 260-300 arası basamakları toplamı 7 olan sayı yok.
 
Hala bir cevap yokmu arkadaslar. Bu bir zeka sorusu ise vardır bir çözümü.

Bunu çözecek zekada biri aranıyor pls...
 
azra' Alıntı:
7
.
.
16
.
.
25
.
.

34
.
.
43
.
.
....
106
...
304
...
şeklinde 9 artarak gidiyor. bir formül vardı.terim sayısı ile ilgili

terim sayısı=[(son terim - ilk terim) / Artış miktarı] + 1

=[(100000 - 1) / 9 ] + 1

= 11112


bu formül verilen aralıktaki sabit artışa göre sayıları toplar, bu soruda artış miktarı ne olacak?
bu formülle hayatta olmaz.

ah okuldaki bilgisayarımda delphi kurulu olsaydı işte...
 
bu toplama değil, terim sayısı bulma formülü. sayılar 9 artarak gidiyordu başta ona göre bulduğum sonuç kaç sayı olduğunu gösteriyor gibi düşünmüştüm ama

ertann83 yazdı:
arkadaşlar 80-100 arası yada 170-200 arası 260-300 arası basamakları toplamı 7 olan sayı yok.

arkadaşın hatırlatmasıyla düzenli olmadığını farkettim.
belki arada olmayanlar çıkarılabilirse sonuç çıkar.
 
Hakkat zormuş, tubitak birde kağıt kalem hes. mak. olmadan bul diyor öyle mi?
:!:
 
hocam toplam 330 tane var ama,
matematiksel olarak formülize edemiyoruz işte.
function say(maks,bas_top)
{
var sayac=0, i=0, l=0, t=0, bs="";
for(i=0;i<maks;i++)
{
t=0;
bs=i+'';//i yi string e cevirmek için
for(l=0;l<bs.length;l++)
{
t=t+eval(bs.charAt(l));
}
if(t==bas_top) sayac++;
}
alert(sayac);
}

1-99 arası 8 tane
100-199 arası 7 tane
200-299 arası 6 tane
300-399 arası 5 tane
400-499 arası 4 tane
500-599 arası 3 tane
600-699 arası 2 tane
700-799 arası 1 tane
800-999 arası YOK
1-999 arasında toplam 36 tane

1000-1999 arası 28 tane
2000-2999 arası 21 tane
3000-3999 arası 15 tane
4000-4999 arası 10 tane
5000-5999 arası 6 tane
6000-6999 arası 3 tane
7000-7999 arası 1 tane
8000-9999 arasında YOK
1000-9999 arasında toplam 84 tane

1-9999 arasında 120 tane
10000-19999 arasında 84 tane
20000-29999 arasında 56 tane
30000-39999 arasında 35 tane
40000-49999 arasında 20 tane
50000-59999 arasında 10 tane
60000-69999 arasında 4 tane
70000-79999 arasında 1 tane
80000-100000 arasında YOK

İlginç olan kısım her yeni aralıkta 1-1000, 1001-10000, 10001-100000 bir önceki aralıkta bulunan sayılar kadar azalma yapıyor olması.
 
azra' Alıntı:
7
.
.
16
.
.
25
.
.

34
.
.
43
.
.
....
106
...
304
...
şeklinde 9 artarak gidiyor. bir formül vardı.terim sayısı ile ilgili

terim sayısı=[(son terim - ilk terim) / Artış miktarı] + 1

=[(100000 - 1) / 9 ] + 1

= 11112
işte bu daha ne cevabı arıyorsun?
 
Hocam c# ta yaptım.
sonuç 330 çıkıyor.


int toplam = 0;
int say=0;
string sayi;
string [] ayir={ "0", "0", "0", "0", "0", "0"};

for (int i = 1; i <=100000; i++)
{
sayi = Convert.ToString(i);

for(int j=0;j<sayi.Length;j++)
ayir[j] = sayi.Substring(j,1);

toplam = Convert.ToInt32(ayir[0]) + Convert.ToInt32(ayir[1]) + Convert.ToInt32(ayir[2]) + Convert.ToInt32(ayir[3]) + Convert.ToInt32(ayir[4]) + Convert.ToInt32(ayir[5]);
if (toplam == 7)
say = say + 1;
}
Console.WriteLine(say);
Console.ReadLine();
 
Aslında burda merak adilen ve işin can alıcı kısmı kaç tane olduğu değil. Çözüm yolu.
Hatırlayın öss yıllarını matematik probremlerini kodlamı çözüyorduk . Bir düzene uydurup bir teoriye uydurup formulize ediyorduk.
 
bu formülü bilmeyen çözemez yani öyle mi?
bu arada 3 farklı programlama dili ile çözüm yapmış arkadaşlar ama bunların içinde en basit kod vb ile olmuş
 
cevap 330 çıkıyor.

kodu ise
////////////////////////as2
kontrol=0;
for(i=0;i<=0;i++){
for(j=0;j<=9;j++){
for(k=0;k<=9;k++){
for(m=0;m<=9;m++){
for(n=0;n<=9;n++){
for(b=0;b<=9;b++){
if((j+k+m+n+b)==7){
kontrol+=1;
trace(i+""+j+""+k+""+m+""+n+""+b);
}
}
}
}
}
}
}
trace(kontrol);

//////////////////
 
ekte flash uygulaması da mevcut. :)
 

Ekli dosyalar

  • tubitak.jpg
    tubitak.jpg
    172.7 KB · Görüntüleme: 994
  • tubitak.rar
    1.1 MB · Görüntüleme: 82
bir cevapta benden;
c#
Kod:
            string rakam = "";
            int raklamlarinToplami = 0;
            int sayac = 0;
            for (int i = 0; i <= 70000; i++)
            {
                rakam =i.ToString();
                for (int j = 0; j < rakam.Length; j++)
                {

                    raklamlarinToplami += rakam[j]-48;
                }
                if (raklamlarinToplami == 7)
                {
                    sayac += 1;
                }
                raklamlarinToplami = 0;
            }
            MessageBox.Show(sayac.ToString());
 
bu sorunun çözümü için 35 dk harcadık... Excell üzerinden makro kullanarak VB ile çalıştırmayı düşündük ama saçmaladı :D... bizde ASP ile web üzerinden çalıştırdık kodları...

KODLARI VERİYORUM

<%
For i = 1000001 To 1100000

cikacak = 0
cikacak = clng(Mid(i, 1, 1)) * 999999
cikacak = cikacak + clng(Mid(i, 2, 1)) * 99999
cikacak = cikacak + clng(Mid(i, 3, 1)) * 9999
cikacak = cikacak + clng(Mid(i, 4, 1)) * 999
cikacak = cikacak + clng(Mid(i, 5, 1)) * 99
cikacak = cikacak + clng(Mid(i, 6, 1)) * 9

If i - cikacak = 8 Then
bulunan = bulunan + 1
response.write i -1000000 & "<br>"
End If

Next
response.write "bulunan sayı sayısı: " & bulunan
%>

Çalıştırdığınızda 330 adet sayı bulunduğunu ve bulunan 330 sayıyı tek tek ekrana yazıyor...


FORMÜLÜ AÇIKLIYORUM :
1 basamak için problemimiz yok...
2 basamak için= (sayı) - (onlar basamağındaki rakam)*9
3 basamak için= (sayı) - (yüzler basamağındaki rakam)*99 - (onlar basamağındaki sayı)*9
4 basamak için= (sayı) - (binler basamağı)*999 - (yüzler basamağı)*9 - (onlar basamağı)*9

formül bu şekilde işliyor ancak biz bu sayılara 1000000 ekleyerek tek formül haline getirdik. böylece kod kalabalığı ve anlamsızlığı ortadan kaldırmak istedik... yani bu şekilde ilerleyen formülümüzü kodlardada görüleceği üzere sadece 6 basamak için gerçekleştirerek tek bir formülle işlemi gerçekleştirdik. işte burada şunu gözden kaçırmamak lazım. 1000000 ekleyince başa doğal olarak 1 fazla eklemiş oluyoruz. o sebeple toplamı 8 olanları say dedik prgramımızda. ancak ekrana yazdırırken bir eksiğini ekrana yazdır dedik...

formülü deneyin çalışıyor :)...
 
OK_FsM_Han' Alıntı:
Hala bir cevap yokmu arkadaslar. Bu bir zeka sorusu ise vardır bir çözümü.

Bunu çözecek zekada biri aranıyor pls...

Bu bir zeka sorusu değil,
ayrıca kodları vermiş olan arkadaşlarımızın çözüm algıritmaları güzel emeklerine sağlık.
 
Geri
Üst