Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

Чемпионы рейтинга экспертов в этой рассылке

Hubbitus
Статус: 10-й класс
Рейтинг: 76
∙ повысить рейтинг >>
Micren
Статус: Практикант
Рейтинг: 34
∙ повысить рейтинг >>
witek25
Статус: 3-й класс
Рейтинг: 30
∙ повысить рейтинг >>

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1299
от 09.05.2009, 20:35

Администратор:Dr_Andrew
В рассылке:Подписчиков: 520, Экспертов: 40
В номере:Вопросов: 2, Ответов: 3

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>

Вопрос № 166453: Здравствуйте. Помогите плиз с решением задачи: нужно найти число,такое что если его умножить на 4 цифры числа будут в обратном порядке, например, клоп+клоп+клоп+клоп=полк. Вот решения программы, не могу найти ошибку помогите плиз #include <cstd...


Вопрос № 166454: строки 1. Дана символьная строка. Подсчитать количество букв k в последнем ее слове. 2. В записке слова зашифрованы — каждое из них записано наоборот. Расшифровать сообщение. структуры 1. Дан файл Assort, содер...

Вопрос № 166.453
Здравствуйте. Помогите плиз с решением задачи: нужно найти число,такое что если его умножить на 4 цифры числа будут в обратном порядке, например, клоп+клоп+клоп+клоп=полк. Вот решения программы, не могу найти ошибку помогите плиз
#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;

int main(void)
{
int k,l,o,p,s,su;

for(k=1;k<=9;k++)
{
}
for(l=0;l<=9;l++)
{
}
for(o=0;o<=9;o++)
{
}
for(p=0;p<=9;p++)
{
}
k!=l;
k!=o;
k!=p;
l!=o;
l!=p;
o!=p;
s=4*(1000*k+100*l+10*o+p);
su=p*1000+o*100+10*l+k;

if(s==su)
{cout<<" k= "<<k;
cout<<" l= "<<l;
cout<<" o= "<<o;
cout<<" p= "<<p;
}
getch();
}
Отправлен: 04.05.2009, 20:26
Вопрос задал: Иванов,Максим,Сергеевич (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Терсков Сергей
Здравствуйте, Иванов,Максим,Сергеевич!
Ошибка - это практически весь код. Все циклы работаю вхолостую, т.к. нет ни одного оператора в теле цикла. Подобные операторы (k!=l;) вообще ничего не дают. Предложу достаточно простое решение с использованием строк. Вот его код:
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {

int limit = 1000000;
int mult = 4;

char str_1[32];
char str_2[32];

for(int i=1; i<limit; i++) {

itoa(i, str_1, 10);
itoa(i*mult, str_2, 10);

if(strcmp(str_1, strrev(str_2)) == 0)
printf("%d - (*4) %d ", i, i*mult);
}

return 0;
}
Ответ отправил: Терсков Сергей (статус: Специалист)
Ответ отправлен: 05.05.2009, 03:59

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 248644 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает: Micren
    Здравствуйте, Иванов,Максим,Сергеевич!
    Программа. Тестировалась MS VS 2008
    Код:

    #include <limits>
    #include <iostream>
    #include <iomanip>
    #include <ctime>

    using namespace std;

    // Тип данных для наших чисел
    typedef unsigned int datatype;

    // Максимальное значение которое мы будем проверять равно
    const datatype maxNumber=numeric_limits<datatype>::max()/4;

    // Осуществляет проверку числа согласно условию задачи
    bool check(register datatype num)
    {
    register datatype tmp=num,reverseNum=0;
    // Перевернем число так, чтоб в reverseNum было число записанное наоборот
    while(tmp)
    {
    unsigned int digit=tmp%10;
    tmp/=10;
    reverseNum=reverseNum*10+digit;
    }
    return num*4==reverseNum;
    }

    int main()
    {
    setlocale(LC_ALL,"russian_russia");
    // Счетчик найденных чисел
    unsigned int count=0;
    // Подсчитаем время выполнения
    clock_t stime=clock();
    // Будем рассматривать только такие числа для которых количество цифр в числе и в числе*4 одинаково
    // это условие истинно для диапазонов [0..2.5),[10..25),[100..250) и т.д.
    // Это сократит количество вариантов перебора в 4 раза
    for(register datatype num=1,low=1;num<maxNumber;low*=10)
    {
    // high=low*2.5 с округлением до ближайшего большего целого числа
    datatype high=(low<<1)+(low>>1)+(low&1);
    if(high>maxNumber)high=maxNumber;
    // Перебор чисел из диапазона [low..high)
    for(num=low;num<high;++num)
    {
    // Проверяем число и выводим результат
    if(check(num))
    {
    cout<<++count<<") "<<"4*"<<num<<"="<<4*num <<endl;
    }
    }
    }
    clock_t etime=clock();
    double runTime=(etime-stime)/CLOCKS_PER_SEC;
    cout<<"Найдено "<<count<<" чисел"<<endl;
    cout<<"Время выполнения:"<<fixed<<setprecision(2)<<runTime<<"(сек)"<<endl;
    system("PAUSE");
    return 0;
    }

    Результат работы:
    Код:

    1) 4*2178=8712
    2) 4*21978=87912
    3) 4*219978=879912
    4) 4*2199978=8799912
    5) 4*21782178=87128712
    6) 4*21999978=87999912
    7) 4*217802178=871208712
    8) 4*219999978=879999912
    Найдено 8 чисел
    Время выполнения:49.00(сек)

    А вот та же программа для Intel C++ Compiler с использованием omp-многопоточ ности(компилировать надо с ключём /openmp)
    Код:

    #include <limits>
    #include <iostream>
    #include <iomanip>
    #include <ctime>

    using namespace std;

    typedef unsigned int datatype;

    const datatype maxNumber=numeric_limits<datatype>::max()/4;

    bool check(register datatype num)
    {
    register datatype tmp=num,reverseNum=0;
    while(tmp)
    {
    unsigned int digit=tmp%10;
    tmp/=10;
    reverseNum=reverseNum*10+digit;
    }
    return num*4==reverseNum;
    }

    int main()
    {
    setlocale(LC_ALL,"russian_russia");
    unsigned int count=0;
    clock_t stime=clock();
    for(datatype num=1,low=1;num<maxNumber;low*=10)
    {
    datatype high=(low<<1)+(low>> ;1)+(low&1);
    if(high>maxNumber)high=maxNumber;
    num=low;
    #pragma omp parallel for shared(count)
    for(register datatype i=low;i<high;++i)
    {
    if(check(i))
    {
    #pragma omp critical
    {
    cout<<++count<<") "<<"4*"<<i<<"="<<4*i<<endl;
    }
    }
    }
    num=high;
    }
    clock_t etime=clock();
    double runTime=(etime-stime)/CLOCKS_PER_SEC;
    cout<<"Найдено "<<count<<" чисел"<<endl;
    cout<<"Время выполнения:"<<fixed<<setprecision(2)<<runTime<<"(сек)"<<endl;
    system("PAUSE");
    return 0;
    }

    Код:

    1) 4*2178=8712
    2) 4*21978=87912
    3) 4*219978=879912
    4) 4*2199978=8799912
    5) 4*21782178=87128712
    6) 4*21999978=87999912
    7) 4*217802178=871208712
    8) 4*219999978=879999912
    Найдено 8 чисел
    Время выполнения:12.00(сек)

    Время выполнения говорит само за себя.
    Ответ отправил: Micren (статус: Практикант)
    Ответ отправлен: 05.05.2009, 14:01

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 248666 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 166.454
    строки

    1. Дана символьная строка. Подсчитать количество букв k в последнем ее слове.


    2. В записке слова зашифрованы — каждое из них записано наоборот. Расшифровать сообщение.


    структуры

    1. Дан файл Assort, содержащий сведения об игрушках: указывается назва¬ние игрушки ее стоимость в рублях и возрастные границы (например, игрушка может преднаоначаться для детей от двух до пяти пет). Получить название самой дорогой игрушки, подходящей детям двух-трех лет.

    2. В таблице хранятся следующие данные об учениках: фамилия, имя, от¬чество, рост, масса. Вычислить средний рост учеников, рост самого высокого и самого низкого ученика. Сколько учеников могут заниматься в баскетбольной секции, если рост баскетболиста должен быть больше 170 см?


    функции


    1. Сравнить площади колец, внутренние радиусы которых равны г1, r2, а внешний — заданному числу R (R > r1 и R>r2).


    2. Найти (в градусах, минутах и секундах) все угла треугольника, вершины которого заданы координатами (x1, y1), (x2, y2), (x3, y3).


    файлы

    1. Дал файл, содержащий текст, включающий русские и английские слова. Подсчитать, каких букв в тексте больше — русских или латинских.


    2. Имеется внешний текстовый файл. Напечатать первую из самых коротких его строк.


    двумерные масивы

    1. Задана квадратная матрица. Переставить строку с максимальным элемен¬том на главной диагонали со строкой с заданным номером k.

    Приложение:

    Отправлен: 04.05.2009, 20:31
    Вопрос задал: aleks1988 (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 1)

    Отвечает: Hromovnik046
    Здравствуйте, aleks1988!
    №1. Строки:
    "Дана символьная строка. Подсчитать количество букв k в последнем ее слове."

    Приложение: