İkili Basamak dizi için Ondalık Basamak Array dönüştürme

oy
2

Bu muhtemelen oldukça egzotik bir sorudur.

şöyle Benim Sorun:

TI 83+ grafik hesap makinesi bir bilgisayara veya TI-BASIC yerleşik programlama diline Meclisi ve bir bağlantı kablosu kullanarak üzerinde programlamak için izin verir.

Ne buldum göre, sadece 16-bit Tamsayılar ve bazı taklit yüzen destekler.

Bunun için ben tek haneli içeren bir dizi kullanmak kadar ki biraz daha büyük sayılar (bit 64 civarında) birlikte çalışmak istiyoruz:

{1, 2, 3, 4, 5}

Ondalık 12345 olacaktır.

ikili olarak, yani 110.000 00111001 veya ikili sayı dizi olarak verilmiştir:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}

hangi hesap görüntüler nasıl olurdu.

Nasıl ondalık basamak bir diziye (hesap yerli türü olarak görüntülemek için için çok büyük) ondalık basamak bu diziyi dönüştürme hakkında gitmek?

Verimlilik bir sorun değildir. Bu ödev DEĞİLDİR.

Bu tür diziler ve bu tür için eklenmesi uygulamaya beni özgür bırakacak.

Teşekkürler!

Oluştur 01/11/2009 saat 13:10
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Burada ana sorun, birbirinden katları olmayan ve dolayısıyla Rakamları ve çıkış basamağı arasında doğrudan izole haritalama yoktur üsleri arasında gidiyoruz olmasıdır. Muhtemelen en önemsiz rakam ile başlamak zorunda gidiyoruz, size bir sonraki basamağı danışmak gerekir önce can ve benzeri olarak çıktı çıkışı gibi birçok azından önemli basamak. yalnızca girdi rakamı en fazla 2 olması gerekir Bu şekilde zaman içinde herhangi bir noktada incelenmekte olan.

Sen tersine forma numaralarını saklamak için işleme sırası (en az önemli basamak dizideki ilk gelip böyle) açısından avantajlı bulabilir.

Cevap 01/11/2009 saat 13:19
kaynak kullanıcı

oy
1

Bu konuda Düşünce ve ben şu 'algoritma' ile yapacağını düşünüyorum

  • (Örnek durumda 5) son kontrol basamağı
  • Bu (ters gelen) tek, mağaza 1 ikili bir dizi ise

  • Şimdi şu yöntemle de 2 ile sayısına bölün:

  • İlk rakam ile başlayan ve 'taşımak' değişkeni temizleyin.
  • 2 bölerek ve 'taşımak' değişkeni ekleyin. Geri kalan 1 ise o zaman taşıma 5'i koymak (bir ve & 1 ile bölünmeyi yapmadan önce bu kontrol edin)
  • e kadar tüm basamaklar yapılmıştır tekrarlamak

tam sayı 0 en düşürülür e kadar tekrar iki adımını tekrarlayın.

İkili dizide sayı ikili temsilidir

senin örneğin: 1,2,3,4,5

  • 5 garip yüzden ikili dizide 1 depolamak: 1
  • Biz algoritması kullanılarak 2 ile dizi bölmek:
  • 0,2,3,4,5 => 0,1 + 5,3,4,5 => 0,6,1,4,5 => 0,6,1,2 + 5,5 => 0, 6,1,7,2

ve tekrar et:

(Biz sağdan sola ikili dize doldurmak bildirimi) 0,1: 0,6,1,7,2 son basamak yüzden 0 saklamak olduğunu bile

vb

Eğer bir ikili ile bitirmek

DÜZENLEME: Yukarıdaki netleştirmek için: benim yaptığım tüm yaş eski algoritmadır:

 int value=12345;
 while(value>0)
 {
      binaryArray.push(value&1);
      value>>=1;     //divide by 2
 }

) ^; Daki örnekte hariç daha önce bir int ama (10 baz) temsil eden bir dizi bilgisi int yok

Cevap 01/11/2009 saat 14:02
kaynak kullanıcı

oy
0

o ikili gösterimi var ve sonra tamamen rakamlardan ikili temsillerini eklemek Yolda ondalık temsilinde her haneyi dönüştürmek olacaktır:

5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000

             101
          101000
       100101100
     11111010000
+ 10011100010000
----------------
  11000000111001

C # kavramının kanıtı:

Ikili rakamlar dizisi için dönüştürme dizileri eklenmesi ve on ile bir dizi çarpma için metodlar:

private static byte[] GetBinary(int value) {
  int bit = 1, len = 1;
  while (bit * 2 < value) {
    bit <<= 1;
    len++;
  }
  byte[] result = new byte[len];
  for (int i = 0; value > 0;i++ ) {
    if (value >= bit) {
      value -= bit;
      result[i] = 1;
    }
    bit >>= 1;
  }
  return result;
}

private static byte[] Add(byte[] a, byte[] b) {
  byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
  int carry = 0;
  for (int i = 1; i <= result.Length; i++) {
    if (i <= a.Length) carry += a[a.Length - i];
    if (i <= b.Length) carry += b[b.Length - i];
    result[result.Length - i] = (byte)(carry & 1);
    carry >>= 1;
  }
  if (result[0] == 0) {
    byte[] shorter = new byte[result.Length - 1];
    Array.Copy(result, 1, shorter, 0, shorter.Length);
    result = shorter;
  }
  return result;
}

private static byte[] Mul2(byte[] a, int exp) {
  byte[] result = new byte[a.Length + exp];
  Array.Copy(a, result, a.Length);
  return result;
}

private static byte[] Mul10(byte[] a, int exp) {
  for (int i = 0; i < exp; i++) {
    a = Add(Mul2(a, 3), Mul2(a, 1));
  }
  return a;
}

Bir dizi dönüştürme:

byte[] digits = { 1, 2, 3, 4, 5 };

byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
  bin[i] = Mul10(GetBinary(digits[i]), exp);
  exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
  result = result == null ? digit: Add(result, digit);
}

// output array
Console.WriteLine(
  result.Aggregate(
    new StringBuilder(),
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
  ).ToString()
);

Çıktı:

1,1,0,0,0,0,0,0,1,1,1,0,0,1

Düzenleme:
onlarca bir dizi çarpma eklendi yöntemler. Bir ikili dizi dönüştürmeden önce basamak çarpılması intead, bu diziye yapılmalıdır.

Cevap 01/11/2009 saat 14:23
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more