Показать полную графическую версию : [решено] Найти числа в массиве.
alena_lep
06-03-2014, 18:32
Здравствуйте! Мне нужно найти в массиве числа, которые совпадают с последними разрядами своих квадратов. Я написала функцию, но она не работает. Больше на ум ничего не приходит. Помогите исправить пожалуйста.
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);
}
}
Привет Алёна.
c+=a*pow(10.0, b); »
int i=0, square, a, b=0, c=0; »Почему инициализируете b нулём?
Почему нулём инициализация? Может 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. Сейчас попробую накодить чего-нибудь.
Блин, что-то я не понимаю задачу. Допустим у нас такой массив. Возводим 12 в квадрат = 144, что дальше? Отрываем два последних разряда 144 и ищем 44 среди массива, так?
...
const int n =5;
int mas[n] = {12, 22, 44, 66, 55};
...
alena_lep
06-03-2014, 22:13
Блин, что-то я не понимаю задачу. Допустим у нас такой массив. Возводим 12 в квадрат = 144, что дальше? Отрываем два последних разряда 144 и ищем 44 среди массива, так? »
Например, у нас есть число 25, 25 в квадрате = 625. Оно совпадает с последними двумя разрядами, значит выводим 25. 5^2=25, 76^2=5776, их тоже выводим и т. д.
10.0 также бесполезно писать, т.к. тип у вас объявлен int, всё равно отбросится значение после точки. »
Если не так напишу, он мне вот что пишет:
pow: неоднозначный вызов перегруженной функции
может быть "long double pow(long double,int)"
или "float pow(float,int)"
или "double pow(double,int)"
1. Функция GetQuadre(int mas[], int n) // Вычисляем последний разряд квадрата считаного числа (что подразумевается под последними разрядами? 1 цифра или 2 цифры? Число может получиться разным...) »
Вот именно, что число может получиться разным, для однозначного числа нужно вычислить одну цифру, для двузначного - две. Только я не понимаю, как это реализовать.
alena_lep
06-03-2014, 22:31
Я вот что поняла. переменная с записывает все квадраты элементов массива, и она оказывается очень большим числом. Поэтому моя функция и не работает. Если это исправить, то получится вот что, но она работает только для однозначных чисел, но как ее сделать для двух- трех- значных?
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);
}
}
Например, у нас есть число 25, 25 в квадрате = 625. »
А почему взяты числа по основанию десять...???...
25dec=19h
625dec=271h
Ну и что в каких разрядах на int (целые со знаком в этих числах совпает)...???...
Либо сравнивайте на полубайтах (ниблах), либо уходите на десятичную арифметику... Вот только у процессора нет представления десятичных чисел... И тогда нужно строковые/символьные данные вводить и с ними работать...
Я вот что поняла. переменная с записывает все квадраты элементов массива, и она оказывается очень большим числом. Поэтому моя функция и не работает. Если это исправить, то получится вот что, но она работает только для однозначных чисел, но как ее сделать для двух- трех- значных? »
Вы не в том цикле обнуляете 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
Вы не в том цикле обнуляете b и c. »
Да, точно не в том. Спасибо, так теперь работает.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.