çok karışık bu roma rakamları,
ben cayma hakkımı kullanmak istiyorum nasıl olsa ödev falan değil![]()
çok karışık bu roma rakamları,
ben cayma hakkımı kullanmak istiyorum nasıl olsa ödev falan değil![]()
...
Cayma!Yanılmıyorsam çok basit bir algoritma:
- büyük hanelerden başla
- bu hanenin değerine böl
- bölüm 1, 2, veya 3 ise o kadar sayıda karakter yazdır (örneğin 2: II)
- bölüm 4 ise, bu hanenin karakterini ve bir büyük hanenin karakterini yan yana yazdır (örneğin 40'ı 10'a bölünce 4 kaldığı için XL)
- kalanıyla devam et
Bölüm 5 olamaz. Sıfır olursa hiçbir şey yazma...
Kendim yazmadım ama öyle olurmuş gibi geliyor.
Ali
caymayım erteleyim o zaman, bi yere not ediyorum bu programı bi ara yaparım, bi ara ne zaman gelir bilmem![]()
...
Ben şimdi bakıyorum... Haklısın: o kadar kolay değilmiş.
Ali
Beni zorlayan tarafı, 49 gibi değerlerin nasıl yazıldıklarını bilmememmiş: Örneğin 50-1 anlamında IL'nin yasal olup olmadığını bilmiyordum. Yasal değilmiş.
Beni yanıltan; 1, 5, 10, 50, vs. gibi aksak değerler oldu. Oysa onlardan bağımsız olarak, ondalık sayı sistemindeki gibi ele almak gerekiyormuş: birler, onlar, yüzler, vs.
Örneğin 1649: 1000 için M, 600 için DC, 40 için XL, ve 9 için IX.
Ek kural: Sayıları parantez içinde yazdırmak "bin katı" anlamına geliyor. Örneğin bir milyon için (M).
Ali
Dizilerle yazmayı denedim ve doğru çalıştı:
PHP Kodu:#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int Sayi = 0;
string Sonuc = "";
string RomaBinler[] = {"", "M", "MM", "MMM", "MMMM", "(V)", "(V)M", "(V)MM", "(V)MMM", "M(X)"};
string RomaYuzler[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
string RomaOnlar[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
string RomaBirler[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
cout << "0 ile 9999 arasında bir sayı girin." << endl;
cin >> Sayi;
Sonuc = RomaBirler[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaOnlar[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaYuzler[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaBinler[Sayi % 10] + Sonuc;
Sayi /= 10;
cout << endl << Sonuc;
_getch();
return 0;
}
Ben de aynı şekilde bir tabloyla hallettim. Bu kadar kolay bir algoritması varmış gibi göründüğü halde en kolay ve belki de en hızlı çözümün bu olması ilginç.
string'in önüne eklemek aklıma gelmediği için ben bütün sabit dizgileri ters sırada yazdım. Örneğin 40 için "LX". Hep sonucun sonuna ekledim ve en sonunda string'i ters çevirdim.
Bu arada, karakterlerin tepesine çizgi çekmek, veya karakteri parantez içinde yazdırmak "bin katı" anlamına geliyormuş. Yani "(M)", milyon oluyor. Dolayısıyla daha büyük bir tabloyla daha büyük sayılar da desteklenebilir.
Tablonun son satırı boş kalmasın diye kendimce iki kere parantez kullanmayı da kabul ettim:
9999999: ((IX))(CM)(XC)(IX)CMXCIX
Ali
kodu biraz daha geliştirdim,artık sınır 999999.
PHP Kodu:#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
string Cevir(int Sayi)
{
string Sonuc = "";
string RomaYuzBinler[] = {"", "(C)", "(CC)", "(CCC)", "(CD)", "(D)", "(DC)", "(DCC)", "(DCCC)", "(CM)"};
string RomaOnBinler[] = {"", "(X)", "(XX)", "(XXX)", "(XL)", "(L)", "(LX)", "(LXX)", "(LXXX)", "(XC)"};
string RomaBinler[] = {"", "M", "MM", "MMM", "MMMM", "(V)", "(V)M", "(V)MM", "(V)MMM", "M(X)"};
string RomaYuzler[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
string RomaOnlar[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
string RomaBirler[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
Sonuc = RomaBirler[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaOnlar[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaYuzler[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaBinler[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaOnBinler[Sayi % 10] + Sonuc;
Sayi /= 10;
Sonuc = RomaYuzBinler[Sayi % 10] + Sonuc;
Sayi /= 10;
return Sonuc;
}
int _tmain(int argc, _TCHAR* argv[])
{
system("title Roma Rakamına Çevirici - CrimeCoder");
setlocale(LC_ALL, "Turkish");
while (true)
{
system("cls");
int Sayi = 0;
cout << "0 ile 999999 arasında bir sayı girin." << endl;
cin >> Sayi;
if (Sayi <= 999999)
{
cout << endl << Cevir(Sayi);
}else
{
while (Sayi < 0 || Sayi > 999999)
{
cout << endl << "Girdiğiniz sayı belirtilen sınırlar içerisinde değil!" << endl;
cin >> Sayi;
}
cout << endl << Cevir(Sayi);
}
_getch();
}
return 0;
}
Ben "ternary operator"u tam çevirisi ile "üçlü işleç" olarak kullanıyorum. (Bu forumla ilgili değil ama kendi benimsediğim sözcükleri içeren sözlük şu: http://ddili.org/sozluk.html)
Ali
There are currently 1 users browsing this thread. (0 members and 1 guests)
Bookmarks