On Sunday, 23 January 2022 at 08:51:20 UTC, Ali Çehreli wrote:
> Benim çözümde sorunlar var.
On 1/22/22 15:37, Ali Çehreli wrote:
> struct Bölen {
ulong değer;
Değer ulong seçilmiş olduğundan bu kod int ile çalışamaz çünkü int aşağıdaki bazı işlemler sırasında otomatik olarak ulong'a dönüştürülür.
Bende de sayılar büyükdükçe L harfi ile betimlemem gerekti. Teorik olarak sorunsuz katrilyona çıktım ve aynı kodlar üzerinden İngilizce versiyonunu yaptım. Henüz sizin kodlara bakamadım çünkü dışardayım; karantinam bitti de :)
Önce 2 işlevlik bir struct yaptım ama sonra beğenmedim dışarı çıkartıp 2. basamakla ile beraber karşılaştırdım. İlla ki aralarında performans farkı vardır. Satır sayısı ise test hariç 2 x 15 diyebiliriz?
long[] girdiler = [ 741, 1_500, 2_001,
5_005, 1_250_000, 3_000_042, 10_000_000,
1_000_000, 2_000_000, 100_000, 200_000,
10_000, 20_000, 1_000, 2_000, 74, 7,
1_001_001_001, 999_001_001_001 ];
import std.conv, std.stdio;
void main() {
long[6] b, b2; // v1, v2 için basamaklar
enum s {
Bir = 1L, Bin = 10^^3L,
Milyon = 10^^6L, Milyar = 10^^9L,
Trilyon = 10^^12L, Katrilyon = 10^^15L
}
void basamakla1(long i) {
b[0] = i % s.Bin;
b[1] = i - b[0];
b[2] = b[1] - (b[1] % s.Milyon);
b[1] = (b[1] % s.Milyon) / s.Bin;
b[3] = b[2] - (b[2] % s.Milyar);
b[2] = (b[2] % s.Milyar) / s.Milyon;
b[4] = b[3] - (b[3] % s.Trilyon);
b[3] = (b[3] % s.Trilyon) / s.Milyar;
b[4] /= 10^^12L;
} // 14-15 satır
// ismi, eskiden toString()'di...
string güzelSayı() {
string r;
r ~= b[3] > 1 ? " " ~ to!string(b[3]):
b[3] ? " " ~ to!string(s.Bir) : "";
r ~= b[3] ? " " ~ to!string(s.Milyar): "";
r ~= b[2] > 1 ? " " ~ to!string(b[2]):
b[2] ? " " ~ to!string(s.Bir) : "";
r ~= b[2] ? " " ~ to!string(s.Milyon): "";
r ~= b[1] > 1 ? " " ~ to!string(b[1]): "";
r ~= b[1] ? " " ~ to!string(s.Bin) : "";
r ~= b[0] ? " " ~ to!string(b[0]) : "";
return r;
} // 14-15 satır
void basamakla2(long i) {
import std.array, std.range, std.algorithm, std.format;
auto parçala = format("%,?3d", '|', i).split('|');
auto sayılar = parçala.retro.array;
foreach(basamak, sayı; sayılar) {
// v--- burayı unutma
b2[basamak] = to!long(sayı);
}
} // 6-7 satır
// ### TESTLER: ####
auto tekTest = girdiler[$-2];//1001001001
basamakla1(tekTest);
basamakla2(tekTest);
// iddia ediyorum, her 2 basamaklama yöntemi eş
assert(b2 == b);
// madem eş, her ikisi de aynı sonucu verecek:
b2.writeln(" =? eşitmiş!\n", b);
güzelSayı.writefln!"|%s|\n";
foreach(i, g; girdiler) {
writef("%,?3d: ",'.', g);
i.writeln(". test");
basamakla1(g);/* Dikkat: tekli testten dolayı,
* yöntemler arasında geçiş
* yapılacaksa değişiklik şart'
*/
güzelSayı.writefln!"|%s|\n";
}
} /* ÇIKTISI: Kesinlikle istediğim gibi ama
sadece en baştaki boş karakteri halledemedim!*/
Başarılar...