Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Найти числа в массиве. (http://forum.oszone.net/showthread.php?t=278836)

alena_lep 06-03-2014 18:32 2319986

Найти числа в массиве.
 
Здравствуйте! Мне нужно найти в массиве числа, которые совпадают с последними разрядами своих квадратов. Я написала функцию, но она не работает. Больше на ум ничего не приходит. Помогите исправить пожалуйста.
Код:

void Get(int mas[], int n)
{
        int i=0, square, a, b=0, c=0;
        for(; i<n; i++)
        {
                square=mas[i]*mas[i];
                do
                {
                        a=square%10;
                        square/=10;
                        c+=a*pow(10.0, b);
                        if(c==mas[i])
                        {
                                printf("elem: %d ", mas[i]);
                        }
                        else
                        {
                                b++;
                        }
                }
                while(square>0);
        }
}


Drongo 06-03-2014 19:25 2320002

Привет Алёна.
Цитата:

Цитата alena_lep
c+=a*pow(10.0, b); »

Цитата:

Цитата alena_lep
int i=0, square, a, b=0, c=0; »

Почему инициализируете b нулём?
Цитата:

Цитата Drongo
Почему нулём инициализация? Может degree = 1 лучше? »

Функция работать не будет, т.к. вы сравниваете квадрат последнего разряда с текущим элементом массива. 10.0 также бесполезно писать, т.к. тип у вас объявлен int, всё равно отбросится значение после точки.
Код:

c += a * pow(10.0, b);
        if(c == mas[i]){

Вам надо разбить задачу на две подзадачи(две функции, вторую функцию вызывать из первой после вычисления квадратов последних разрядов)
1. Функция GetQuadre(int mas[], int n) // Вычисляем последний разряд квадрата считаного числа (что подразумевается под последними разрядами? 1 цифра или 2 цифры? Число может получиться разным...)
2. Функция SearchQuadre(int quadre) // Передаём полученый "оторваный" разряд(ы) на поиск по массиву.

P.S. Сейчас попробую накодить чего-нибудь.

Drongo 06-03-2014 19:49 2320012

Блин, что-то я не понимаю задачу. Допустим у нас такой массив. Возводим 12 в квадрат = 144, что дальше? Отрываем два последних разряда 144 и ищем 44 среди массива, так?

Код:

...
  const int n =5;
  int mas[n] = {12, 22, 44, 66, 55};
...


alena_lep 06-03-2014 22:13 2320074

Цитата:

Цитата Drongo
Блин, что-то я не понимаю задачу. Допустим у нас такой массив. Возводим 12 в квадрат = 144, что дальше? Отрываем два последних разряда 144 и ищем 44 среди массива, так? »

Например, у нас есть число 25, 25 в квадрате = 625. Оно совпадает с последними двумя разрядами, значит выводим 25. 5^2=25, 76^2=5776, их тоже выводим и т. д.

Цитата:

Цитата Drongo
10.0 также бесполезно писать, т.к. тип у вас объявлен int, всё равно отбросится значение после точки. »

Если не так напишу, он мне вот что пишет:
pow: неоднозначный вызов перегруженной функции
может быть "long double pow(long double,int)"
или "float pow(float,int)"
или "double pow(double,int)"

Цитата:

Цитата Drongo
1. Функция GetQuadre(int mas[], int n) // Вычисляем последний разряд квадрата считаного числа (что подразумевается под последними разрядами? 1 цифра или 2 цифры? Число может получиться разным...) »

Вот именно, что число может получиться разным, для однозначного числа нужно вычислить одну цифру, для двузначного - две. Только я не понимаю, как это реализовать.

alena_lep 06-03-2014 22:31 2320087

Я вот что поняла. переменная с записывает все квадраты элементов массива, и она оказывается очень большим числом. Поэтому моя функция и не работает. Если это исправить, то получится вот что, но она работает только для однозначных чисел, но как ее сделать для двух- трех- значных?
Код:

void Get(int mas[], int n)
{
        int i=0, square, a, b=0, c=0;
        for(; i<n; i++)
        {
                square=mas[i]*mas[i];
                do
                {
                        a=square%10;
                        square/=10;
                        c+=a*pow(10.0, b);
                        if(c==mas[i])
                        {
                                printf("elem: %d ", mas[i]);
                        }
                        else
                        {
                                b++;
                        }
                        c=0;
                        b=0;
                }
                while(square>0);
        }
}


Tau_0 07-03-2014 03:54 2320211

Цитата:

Цитата alena_lep
Например, у нас есть число 25, 25 в квадрате = 625. »

А почему взяты числа по основанию десять...???...
25dec=19h
625dec=271h
Ну и что в каких разрядах на int (целые со знаком в этих числах совпает)...???...

Либо сравнивайте на полубайтах (ниблах), либо уходите на десятичную арифметику... Вот только у процессора нет представления десятичных чисел... И тогда нужно строковые/символьные данные вводить и с ними работать...

torauma 07-03-2014 09:52 2320272

Цитата:

Цитата alena_lep
Я вот что поняла. переменная с записывает все квадраты элементов массива, и она оказывается очень большим числом. Поэтому моя функция и не работает. Если это исправить, то получится вот что, но она работает только для однозначных чисел, но как ее сделать для двух- трех- значных? »

Вы не в том цикле обнуляете b и c. Вот так вроде работает:
Код:

void Get(int mas[], int n)
{
    int i=0, square, a, b=0, c=0;
    for(; i<n; i++)
    {
        square=mas[i]*mas[i];
        do
        {
            a=square%10;
            square/=10;
            c+=a*pow(10.0, b);
            if(c==mas[i])
            {
                printf("elem: %d ", mas[i]);
            }
            else
            {
                b++;
            }
            //c=0;
            //b=0;
        }
        while(square>0);
        c=0;
        b=0;
    }
}


alena_lep 07-03-2014 10:07 2320283

Цитата:

Цитата torauma
Вы не в том цикле обнуляете b и c. »

Да, точно не в том. Спасибо, так теперь работает.


Время: 18:56.

Время: 18:56.
© OSzone.net 2001-