none
преобразование типов RRS feed

  • Вопрос

  • у меня небольшой вопрос..

    есть задача , пользователь вводит число n, (n - количество нулей), программа возводит 3 в степень начиная с нулевой, до тех пока в числе не окажется n- ое количество нулей, если оказалось, то программа выводит это число, и выводит данную степень.

    вот код

            private void button1_Click(object sender, EventArgs e)

            {

                int kop = 1;

                int j = 0;

                int kop1 = 0;

                int pop = Convert.ToInt16(textBox1.Text);

                string lop;

                    while (pop != j)

                    {

                        lop = Convert.ToString(Math.Pow(3, kop++));

                        char[] h = lop.ToCharArray();

                        for (int i = 0; i < lop.Length; i++)

                        {

                            if (pop != j)

                            {

                                if (h[i] == '0')

                                {

                                    if (j == 0)

                                    {


                                        kop1 = i;

                                        kop1++;

                                        j++;

                                    }

                                    else

                                    {

                                        if ((j != 0) & (i == kop1))

                                        {

                                            kop1++;

                                            j++;

                                        }

                                        else { j = 0; }

                                    }

                                }

                                else { j = 0; }

                            }

                            else

                            {

                                textBox2.Text = Convert.ToString(kop - 1);

                                textBox3.Text = Convert.ToString(lop);

                                break;

                            }

                        }

                   }

                }

            }

        }

     

    когда n = 2 или 1 работает, а когда ввожу 3 виснит, или выдает ошибку мол нельзя преобразовать

    я думаю ошибка моя тут

    lop = Convert.ToString(Math.Pow(3, kop++));

                        char[] h = lop.ToCharArray();

    просто в какой то момент стринг конвертирует число , и прибавляет ему E+123... , и поэтому следующая строка уже бессмысленна 

    как правильно пере конвертировать из стринг чтобы убрать  E+123... и в чар передать полное число, или может я не тут копаю..

    заранее спасибо за ответ.

     

    13 декабря 2010 г. 23:13

Ответы

  • double в такиех вычислениях не точен.

    Используйте класс BigInteger из пространства имен System.Numerics;

    В степень возводите с помощью метода BigInteger.Pow


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 9:14
    14 декабря 2010 г. 6:40
  • 1) Метод ToString() никто не отменял, это тот же массив char.

    2) Math.Pow(); - я писал выше, что лучше использовать BigInteger.Pow()

    3) Код: (для n-подряд идущих нулей)

          int zero_count = int.Parse(textBox1.Text);
          string zeros = new string('0', zero_count);
    
          int count = 0;
          BigInteger bi;
          BigInteger num = 3;
          while (count < 500)
          {
            bi = BigInteger.Pow(3, count++);
            if (bi.ToString().IndexOf(zeros) >= 0)
            {
              MessageBox.Show("Найдено");
              textBox2.Text = bi.ToString();
              break;
            }
          }
    


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 9:14
    15 декабря 2010 г. 6:14

Все ответы

  • double в такиех вычислениях не точен.

    Используйте класс BigInteger из пространства имен System.Numerics;

    В степень возводите с помощью метода BigInteger.Pow


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 9:14
    14 декабря 2010 г. 6:40
  • lop = Math.Pow(3, kop++).ToString("F0");
     
     
    14 декабря 2010 г. 6:51
    Модератор
  •  

    private void button1_Click(object sender, EventArgs e)

            {

                int kop = 35,i = 0;   int j = 0;int kop1 = 0;

                BigInteger lop;

                byte[] h;

                int pop = Convert.ToInt16(textBox1.Text);

                while (pop != j)

                 {    double value = Math.Pow(3, kop++);

                      lop = new BigInteger(value);

                      h = lop.ToByteArray();

                      foreach(byte opf in h)

                      {

                          if (pop != j)

                          {

                              if (opf == 0)

                              {

                                  if (j == 0)

                                  {

                                      kop1 = i;

                                      kop1++;

                                      j++;

                                  }

                                  else

                                  {

                                      if ((j != 0) & (i == kop1))

                                      {

                                          kop1++;

                                          j++;

                                      }

                                      else { j = 0; }

                                  }

                              }

                              else { j = 0; }

                          }

                          else

                          {

                              textBox2.Text = Convert.ToString(kop - 1);

                              textBox3.Text = Convert.ToString(lop);

                              break;

                          }

                          i++;

                      }

     

    я вот изменил, double value = Math.Pow(3, kop++);lop = new BigInteger(value); но теперь как обращаться к i элементу(Lop)  что бы сравнивать с нулем , я посмотрел на примерах , перегоняют в массив байтов, но как тогда i элемент  массива байтов сравнивать с нулем, если сделать как в данном коде, то тут совсем не то получается

    14 декабря 2010 г. 17:12
  • 1) Метод ToString() никто не отменял, это тот же массив char.

    2) Math.Pow(); - я писал выше, что лучше использовать BigInteger.Pow()

    3) Код: (для n-подряд идущих нулей)

          int zero_count = int.Parse(textBox1.Text);
          string zeros = new string('0', zero_count);
    
          int count = 0;
          BigInteger bi;
          BigInteger num = 3;
          while (count < 500)
          {
            bi = BigInteger.Pow(3, count++);
            if (bi.ToString().IndexOf(zeros) >= 0)
            {
              MessageBox.Show("Найдено");
              textBox2.Text = bi.ToString();
              break;
            }
          }
    


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 17 декабря 2010 г. 9:14
    15 декабря 2010 г. 6:14
  • огромное спасибо) уже понял.
    15 декабря 2010 г. 13:13