Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Задача на нахождение числа


Автор: anad 22.11.2006, 21:38
Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число. 

Автор: Solomon 22.11.2006, 22:23
А такое число вообще сущетвует? А то я что то немогу такого числа представить...

Автор: Kuvaldis 22.11.2006, 22:40
anad, 
имхо, должен быть указан диапазон, в котором нужно искать...
А вдруг таких чисел бесконечное множество???

Автор: Solomon 22.11.2006, 22:45
да вряли их бесконечное множество. Я например немогу и одного придумать  smile 

Автор: anad 23.11.2006, 00:11
Не знаю, препод такую задачу дал. Ерунда какая-то.

Автор: AlexST 23.11.2006, 00:12
Цитата(Solomon @  22.11.2006,  22:23 Найти цитируемый пост)
что то немогу такого числа представить...

 smile Ты всегда так проверяешь?  smile 

anad, такого числа нет. Наиболее близкое число 1052.
Зависимость на графике.
user posted image
График не полностью представлен, дальше идет тоже самое с возрастающим (мягко говоря  smile ) расстоянием между максимумами.

Автор: Rockie 23.11.2006, 00:35
anad, не буду ничего добавлять к сказанному AlexST. Впрочем, отсутствие решения в определенном интервале это тоже ответ smile
Код
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void Move2(char* buff)
 { char temp_array[21] = "";            // создаем временный массив
   int length = strlen(buff);
   temp_array[0] = '2';                 // двойку в начало временного массива
   strncat(temp_array, buff, length );  // остальное дописываем
   temp_array[length] = '\0';           // и последнюю двойку удаляем
   strcpy(buff, temp_array);
 }


int main(){
 int range = 100000000;
 char buff[20] = "";

 for(int i=2;i<range;i+=10)
  {  sprintf(buff,"%i",i);               // число в строку
     Move2(buff);                        // перемещаем двойку в начало
     // выводим на экран, если число удвоилось
     if( atoi(buff)/2==i) printf("%s\n",buff); 
  }


  printf("Ok!\n");
  char c = getc(stdin);  

  return 0;
}

Автор: AlexST 23.11.2006, 00:53
Сам себя одурачил. 105263157894736842! Сказал же что мягко говоря крутой диапазон и не стал проверять дальше. Все пользуемся большим числом разрядов.  smile 
Да...., тому кто это придумал нечего было делать явно.  smile 

Автор: AlexST 23.11.2006, 13:24
Задачка чисто на логику, а я стал прогу делать сходу.  smile

Самое простое решение: "разматываем" большее число исходя из двойки в конце меньшего (у большего значит 4 в конце, а у меньшего она предпоследняя; отсюда 8 предпоследняя у большего и т.д.). 

Поскольку зависимость периодическая, то таких чисел бесконечно много к тому же (видно из графика).


Автор: Exception 23.11.2006, 19:38
Помню, такая задачка была в "занимательной математике" Перельмана smile .

Автор: anad 25.11.2006, 01:43
 Ну так как найти это число? 105263157894736842

Автор: Aloha 25.11.2006, 04:00
anad

Числа, которые будут удовлетворять условию задачи – периодические.
Первое из них уже привел AlexST:
Код
105263157894736842

Следующие несколько чисел выглядят так:
Код
105263157894736842105263157894736842
105263157894736842105263157894736842105263157894736842
105263157894736842105263157894736842105263157894736842105263157894736842
105263157894736842105263157894736842105263157894736842105263157894736842105263157894736842

и т.д.
Вот код на VB, генерящий периодическую часть числа (его можно опробовать в любом MS Office’ном приложении):
Код
Sub s_Generate()
  Dim v_Digit As Integer, v_NextDigit As Integer, v_InMind As Integer, v_Str As String
  v_Digit = 1
  Do Until v_Digit = 5 And v_InMind = 0
    v_NextDigit = (2 * v_Digit) Mod 10 + v_InMind
    v_InMind = (2 * v_Digit) \ 10
    v_Str = CStr(v_NextDigit) & v_Str
    v_Digit = v_NextDigit
  Loop
  MsgBox "10" & v_Str
End Sub

Автор: Dov 25.11.2006, 15:09
Код
#include <stdio.h>
#include <conio.h>

int main()
{
    int  num = 2;
    int  x   = 2;

    while(x != 4)
    {
        x   = x % 2 * 10 + num;
        num = x / 2;
        printf("%d", num);
    }

    putchar('\n');
    getch();

    return 0;
}

Автор: Dov 25.11.2006, 16:33
Или даже так
Код
#include <stdio.h>
#include <conio.h>

int main()
{
    int num;

    for(num = 2; num != 4; num = num / 2 + num % 2 * 10)
        printf("%d", num / 2);        

    printf("%d\nPress any key to quit...\n", num / 2);
    getch();

    return 0;
}

Автор: AlexST 25.11.2006, 17:55
Dov, Aloha вы б оставили комменты в прогах хоть. Не знаю как до anad, а до меня туго доходит.  smile 

Автор: Dov 25.11.2006, 18:16
AlexST, а что там комментировать, там всего один маленький цикл, который выводит каждый раз одну цифру.  Если посмотреть на это число 105263157894736842 внимательно, то мы увидим, что оно представляет собой сумму степеней двойки, умноженную на 10 в степени n - 1. Например, последние три цифры этого числа(842) можно записать так: 2 + 2*2*10+2*2*2*100, ну и так далее, пока не получим нужное число.  

Автор: Dov 25.11.2006, 20:44
Может быть так понятнее будет
Код
#include <stdio.h>
#include <conio.h>

int main()
{
    int num = 2;

    do 
    {
        printf("%d", num / 2);
        num = num / 2 + num % 2 * 10;

    }while(num != 2);

    printf("\nPress any key to quit...\n");
    getch();

    return 0;
}

Берём число 2 и начинаем делить его на 2, прибавляя к результату остаток от деления, умноженный на 10, пока сам результат не будет равен 2. Последовательность цифр между этими двумя двойками(включая последнюю) и есть искомое число.  smile  


Автор: AlexST 22.12.2006, 17:02
Dov, ты просто привел два разных способа, а я думал, что это один и тот же. Поэтому не понял.  smile 

Автор: Dov 22.12.2006, 17:27
Цитата(AlexST @  22.12.2006,  16:02 Найти цитируемый пост)
Dov, ты просто привел два разных способа

AlexST, способ один, реализация разная.  smile  

Автор: AlexST 23.12.2006, 14:20
Да,  smile , действительно, способ один.
Только ты всё-таки не смог объяснить мне всё с точки зрения математики.
Комментируешь действия, а я прошу логику...
Сам себе объясняю как надо  smile :

Цитата(Dov @  25.11.2006,  18:16 Найти цитируемый пост)
Если посмотреть на это число 105263157894736842 внимательно, то мы увидим, что оно представляет собой сумму степеней двойки, умноженную на 10 в степени n - 1. Например, последние три цифры этого числа (842) можно записать так: 2 + 2*2*10+2*2*2*100, ну и так далее, пока не получим нужное число.  

Начинать решение с рассмотрения ответа нехорошо.
Намного лучше сказать опираясь на вычисления искомого числа: оно будет суммой степеней двойки соответственно умноженных на 10^(n-1) (а почему??), т. к. для вычисления значения каждого более старшего разряда этого числа мы должны умножить исходный на 2 (вследствие условия перестановки 2 в конце), а 10 берется от веса разряда. (а это другой способ, так скать "вычисление с конца", ИМХО более понятный)


Код

#include <stdio.h>
#include <conio.h>
              //а тут вычисляем "с начала"
int main()
{
    int num = 2;

    do 
    {
        printf("%d", num / 2);//почему? да т.к. искомое получаем делением большего на 2
        num = num / 2 + num % 2 * 10;// здесь ваще не въехал сначала...
            //а всё просто: увеличиваем известную цифру исходного числа на величину переноса в старший 
            //разряд большего числа
            
    }while(num != 2);//условие при выполнении показывает, что мы уже напечатали последнюю цифру
                                //искомого числа, т. к. получившийся "младший" несуществующий разряд большего 
                                //числа сравнялся с 2

    printf("\nPress any key to quit...\n");
    getch();

    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)