Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Найти все числа-палиндромы в целочисленном массиве


Автор: Voldemar2004 18.3.2006, 18:29
Этот код выводит все числа-палиндромы. Просто и понятно.
Код
int i=0;

const N=10;
int a[N] = {1021,321,543,666,645,868,754,534,9669,444};

do
{
        if(IntToStr(a[i])==strrev(IntToStr(a[i]).c_str()) && strlen(IntToStr(a[i]).c_str())==strlen(IntToStr(a[i]).c_str()))
        {cout<<a[i]<<"\n";};

i++;
}
while(i<N);
Но препод сказал, что это слишком просто и сказал, чтобы я сделал это же, но методом Горнера:
Код

p=3456;

cout<<p<<"\n";

cout<<"\n"<<(p % 10) * 1000 + (p / 10 % 10) * 100 + (p / 100 % 10) * 10 + (p / 1000 % 10);
Только совсем запутался в этой каше. Может кто подскажет как организовать здесь цикл?

Автор: Lamak 19.3.2006, 18:54
Вроде так:
Код

int j=0,i=0,S=0,len=0,p=0,t=0;

const N=10;
int a[N] = {1021,321,543,666,645,868,754,534,9669,444};

do
{
        p=a[i];
        len=strlen(IntToStr(p).c_str());
        S=0;
        t=1;
        for(j=1;j<len;j++) t=t*10;
        for(j=1;j<=len;j++)
        {

                S+=(p % 10) *t; //+ (p / 10 % 10) * 100 + (p / 100 % 10) * 10 + (p / 1000 % 10);
                p=p/10;
                t=t/10;
        }
        if(a[i]==S)
        {cout<<a[i]<<"\n";};

i++;
}
while(i<N);

Добавлено @ 18:57
В 12 строке 10 возводиться в степень (len-1),я непомню есть ли оператор возведения в степень

Автор: Voldemar2004 19.3.2006, 23:23
Цитата(Lamak @ 19.3.2006, 18:54 Найти цитируемый пост)
есть ли оператор возведения в степень
не оператор, а функция pow(число, степень) - #include <math.h>
Код
int j=0,i=0,S=0,len=0,p=0,t=0;    
const N=10;    
int a[N] = {1021,321,543,10,645,868,754,534,96969,444};

int f=0, z=0;

do
{    
        p=a[i]; z=a[i];
                     // этот цикл я написал вместо функции strlen(), правда такой фокус
                     // работает только для целочисленных значений массива :)
        do           // len=strlen(IntToStr(p).c_str());
        {
        z/=-10; f++;
        }
        while(z!=0);

        len=f; f=0;

        S=0; t=1;
        for(j=1;j<len;j++) t*=10;
        for(j=1;j<=len;j++)
        {
                S+=(p%10) * t; //+ (p / 10 % 10) * 100 + (p / 100 % 10) * 10 + (p / 1000 % 10);
                p/=10;
                t/=10;
        }
        if(a[i]==S)
        {cout<<a[i]<<"\n";};
i++;
}
while(i<N);

getch();
Lamak, спасибо.

Кстати функцию power - возведение в степень просто написать и самому:
Код
double a=1;

double Chislo, Stepen;

cout<<"Chislo = ";
cin>>Chislo;

cout<<"\nStepen = ";
cin>>Stepen;

for(int i=0; i<Stepen; i++)
{
a*=Chislo;
}
И конечно учитывать отрицательное значение степени, т.е. дробь и корень n-ной степени, если степень дробная. smile

Автор: knitmax87 20.3.2006, 00:09
Цитата

стати функцию power - возведение в степень просто написать и самому:

Ну конечно самодельная функция будет работать не так быстро как библиотечная.

Автор: Lamak 20.3.2006, 18:03
Цитата

Кстати функцию power - возведение в степень просто написать и самому

Так ни кто и не спорит smile !
Просто как-то в последнее время не пользуюсь ей вот и забыл как она называется.
Ведь главное не помнить все функции наизусть а знать что они такие есть и знать где про них можно почитать(тобиш уметь пользоваться хелпом) smile

Автор: Voldemar2004 20.3.2006, 22:32
Цитата(Lamak @ 20.3.2006, 18:03 Найти цитируемый пост)
знать что они такие есть и знать где про них можно почитать
Храним в голове не саму функцию, а указатель на ее описание. smile :
http://www.lib.ru/CTOTOR/kernigan.txt
Цитата
Так значение POWER(2,5) равно 32. Конеч-
но, эта функция не выполняет всей работы операции **, пос-
кольку она действует только с положительными степенями не-
больших чисел, но лучше не создавать дополнительных затруд-
нений, смешивая несколько различных вопросов.
    Ниже приводится функция POWER и использующая ее основная
программа, так что вы можете видеть целиком всю структуру.
Код
 MAIN()  /* TEST POWER FUNCTION */
 {
    INT I;

    FOR(I = 0; I < 10; ++I)
     PRINTF("%D %D %D\N",I,POWER(2,I),POWER(-3,I));
 }

 POWER(X,N)  /* RAISE  X  N-TH POWER; N > 0  */
 INT X,N;
 {
    INT I, P;
    P = 1;
    FOR (I =1; I <= N; ++I)
    P = P * X;
    RETURN (P);
 }
    Все функции имеют одинаковый вид:
 имя (список аргументов, если они имеются)
 описание аргументов, если они имеются
 {
 описания
    операторы
 }


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