Форум программистов, компьютерный форум CyberForum.ru

Представьте число в виде суммы трех приблизительно равных натуральных чисел - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
darkstalker739
17 / 17 / 2
Регистрация: 16.06.2013
Сообщений: 94
16.06.2013, 13:52     Представьте число в виде суммы трех приблизительно равных натуральных чисел #1
Задание: Дано натуральное число k. Представьте его в виде суммы трех приблизительно равных натуральных чисел.
Вот такой код с горем пополам я наклепал :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
 
int _tmain(int argc, _TCHAR* argv[]);
 
using namespace std; 
int main() // С++-программа начинается с функции main().
{
 setlocale(LC_CTYPE, "rus"); // русский язык в консоли
    int k,a,b,c;
    cout << ("ВВедите натуральное число:  \n");
    cin >> k ;
    if (k <= 0) cout << (" Это не натуральное число!!\n");
    if(k > 0)
                { 
                    (a = k / 3 - 1); 
                    cout << ("Первое число:  ");
                    cout << a;
                    cout << ("\n");
                     (b = k / 3);
                    cout << ("Второе число:  ");
                    cout << b;
                    cout << ("\n");
                     (c = k / 3 + 1); 
                     cout << ("Третье число:  ");
                     cout << c;
                     cout << ("\n");
                }
 
 
 
system("pause"); 
return(0);
}
Принцип такой - если вписать число которое делится на 3 - то все в порядке. Все значения выдает как надо.
Если же число делится на 3 c остатком (скажем 100) - то раскладываются на числа 32,33 и 34, что в сумме выходит 99.
Как можно реализовать проверку и дополнение?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 13:52     Представьте число в виде суммы трех приблизительно равных натуральных чисел
Посмотрите здесь:

C++ Представить целое число N в виде суммы M примерно равных целых чисел.
C++ Дано натуральное число n. Можно ли представить его в виде суммы трех квадратов натуральных чисел?
Можно ли представить данное число в виде произведения трех последовательных натуральных чисел C++
C++ Даны натуральное число n. Среди чисел 1, 2, …, n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел.
Даны натуральное число n. Среди чисел 1, 2, …, n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 14:14     Представьте число в виде суммы трех приблизительно равных натуральных чисел #2
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
using namespace std;
 
int main()
{
    int a = 80;
    cout << a << " = " << a / 3 << " + " << a / 3 << " + " << a / 3 + a % 3;
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 14:40     Представьте число в виде суммы трех приблизительно равных натуральных чисел #3
Цитата Сообщение от darkstalker739 Посмотреть сообщение
Задание: Дано натуральное число k. Представьте его в виде суммы трех приблизительно равных натуральных чисел.
- держи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int main()
{
    int n;
    int a, b, c;
    int add = 0;
    while(true)
    {
        cout<<"Enter n : ";cin>>n;
        add = n % 3;
        a = n / 3;
        b = a - add;
        c = a + add;
        cout<<n<<" = "<<a<<" + "<<b<<" + "<<c<<endl;
    }
    return 0;
}
Миниатюры
Представьте число в виде суммы трех приблизительно равных натуральных чисел  
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 14:45     Представьте число в виде суммы трех приблизительно равных натуральных чисел #4
-=ЮрА=-, 33 + 32 + 34 = 100 ??

Добавлено через 25 секунд
3 + 1 + 5 = 11 ???
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:00     Представьте число в виде суммы трех приблизительно равных натуральных чисел #5
lazybiz, ваш алгоритм надо немного подправить, а то 5 = 1 + 1 + 3 не совсем хорошо, лучше бы 5 = 2 + 2 + 1

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int a = 5, x, y, z, ost;
    x = y = z = a / 3;
    ost = a % 3;
    if (ost)
    {
       ++x;
       --ost;
       if (ost)
          ++y;
    }
    cout << a << " = " << x << " + " << y << " + " << z;
    return 0;
}
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 15:01     Представьте число в виде суммы трех приблизительно равных натуральных чисел #6
Thinker, просто я его привел как самое простое решение..
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:06     Представьте число в виде суммы трех приблизительно равных натуральных чисел #7
lazybiz, не спорю, простое решение, но числа не наиболее близки друг другу могут получиться, вот и подправил, теперь все случаи рассмотрены)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.06.2013, 15:14     Представьте число в виде суммы трех приблизительно равных натуральных чисел #8
ну может так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
int n;
int A,B,C;
double tmp;
cin>>n;
 
tmp=(double)n/3.0;
 
A=tmp+0.5;
B=A;
C=n-A-B;
cout << n << " = " << A << " + " << B << " + " << C;
return 0;
}
Не проверял, так накалякал
два числа должны быть одинаковы третье может отличатся на 1 или 2

Добавлено через 2 минуты
можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
int n;
int A,B,C;
double tmp;
cin>>n;
 
tmp=(double)n/3.0;
 
A=tmp+0.5;
 
tmp=(double)(n-A)/2.0;
B=tmp+0.5;
C=n-A-B;
cout << n << " = " << A << " + " << B << " + " << C;
return 0;
}
разница должна быть не больше единицы
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:14     Представьте число в виде суммы трех приблизительно равных натуральных чисел #9
Цитата Сообщение от ValeryS Посмотреть сообщение
два числа должны быть одинаковы третье может отличатся на 1 или 2
наиболее близки, значит в этой задаче максимум на 1 должны отличаться)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.06.2013, 15:30     Представьте число в виде суммы трех приблизительно равных натуральных чисел #10
Thinker,
вторую прогу смотрел?

принцип простой
делим на 3 (дробно)
если дробь 0.3... значит A=n\3;
если дробь 0.6.... A=n\3+1;
вычитаем A из n
разность делим на два
если четное то B=(n-A)/2;
если нечетное то B=(n-A)/2+1;
С разность
в сумме всегда будет n
проверим
n=100
tmp=100/3=33.33333.....
A=33.3+0.5 =33
tmp=(100-33)/2=67/2=33.5;
B=33.5+0.5=34;
C =100-33-34=33;


n=101
tmp=101/3=33.666.....
A=33.6+0.5 =34
tmp=(101-34)/2=67/2=33.5;
B=33.5+0.5=34;
C =101-34-34=33;

n=102
tmp=102/3=34.0
A=34.0+0.5 =34
tmp=(102-34)/2=68/2=34.0;
B=34.0+0.5=34;
C =102-34-34=34;

по моему так
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:34     Представьте число в виде суммы трех приблизительно равных натуральных чисел #11
Цитата Сообщение от ValeryS Посмотреть сообщение
Thinker,
вторую прогу смотрел?
зачем так усложнять, когда все проще можно и без чисел с плавающей точкой
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.06.2013, 15:37     Представьте число в виде суммы трех приблизительно равных натуральных чисел #12
Цитата Сообщение от Thinker Посмотреть сообщение
зачем так усложнять, когда все проще можно и без чисел с плавающей точкой
это не усложнение а упрощение
ни одного ветвления значит выполнятся будет быстрей
времена когда вещественная арифметика долго выполнялась прошли
если нужно чтобы три числа не были равные то можно добавить так
C++
1
2
3
4
5
if(A==B && B==C)
{
 A--;
 C++;
}
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:41     Представьте число в виде суммы трех приблизительно равных натуральных чисел #13
Цитата Сообщение от ValeryS Посмотреть сообщение
ни одного ветвления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    int a = 5, x, y, z, ost;
    x = y = z = a / 3;
    ost = a % 3;
    x += !!ost;
    y += !(ost & 1);
    cout << a << " = " << x << " + " << y << " + " << z;
    return 0;
}
darkstalker739
17 / 17 / 2
Регистрация: 16.06.2013
Сообщений: 94
16.06.2013, 15:44  [ТС]     Представьте число в виде суммы трех приблизительно равных натуральных чисел #14
Цитата Сообщение от lazybiz Посмотреть сообщение
#include <iostream>
using namespace std;
int main()
{
* * int a = 80;
* * cout << a << " = " << a / 3 << " + " << a / 3 << " + " << a / 3 + a % 3;
* * return 0;
}
Значение должен вводить пользователь. Оно может быть любым.

Цитата Сообщение от ValeryS Посмотреть сообщение
tmp=(double)n/3.0;
Плавающей точки также быть не должно. Только целочисленные вычисления т.е. int онли
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 15:45     Представьте число в виде суммы трех приблизительно равных натуральных чисел #15
Цитата Сообщение от darkstalker739 Посмотреть сообщение
Значение должен вводить пользователь. Оно может быть любым.
Вводи любое, кто ж тебе мешает.
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 15:46     Представьте число в виде суммы трех приблизительно равных натуральных чисел #16
Цитата Сообщение от Thinker Посмотреть сообщение
наиболее близки, значит в этой задаче максимум на 1 должны отличаться)
- это не значит отличия на 1-цу, близкие значит числа в одном порядке 101 и 109 это близкие числа.
На счёт кода, вот доработанный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
int main()
{
    int n;
    int a, b, c;
    int add = 0;
    while(true)
    {
        cout<<"Enter n : ";cin>>n;
        add = n % 3;
        a = (n - add) / 3;
        b = a - (add ? 2 : 1);
        c = a + (add ? 2 : 1);
        a = a + add;
        if( c == a)
        {
            c = c + 1;
            a = a - 1;
        }
        cout<<n<<" = "<<a<<" + "<<b<<" + "<<c<<endl;
    }
    return 0;
}
Основное достоинство - способ не возвращает чисел среди которых есть одинаковые.
Примечание для чисел n < 6 не существует a, b, с образующих тождественное равенство n = a + b + c {a != b != c}

Не по теме:

lazybiz,

Цитата Сообщение от lazybiz Посмотреть сообщение
Thinker, просто я его привел как самое простое решение..
- перед словом решение добавь слово неверное

Миниатюры
Представьте число в виде суммы трех приблизительно равных натуральных чисел  
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:48     Представьте число в виде суммы трех приблизительно равных натуральных чисел #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- это не значит отличия на 1-цу
речь идет о модуле разности. в принципе, мне все равно, кто как понял)))
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,026
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 16:01     Представьте число в виде суммы трех приблизительно равных натуральных чисел #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
перед словом решение добавь слово неверное
Как раз в отличии от твоего решения, мой результат оказался верным. Выражение "приблизительно равных" можно расценить по-разному. Я не считаю что 1 и 3 "приблизительно не равны".

Добавлено через 9 минут
-=ЮрА=-, что-то я не понял... ты написал что моё решение неверное, при этом привел пример скриншота своей программы которая выдает неправильные результаты.. Что ты этим хотел сказать?
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 16:08     Представьте число в виде суммы трех приблизительно равных натуральных чисел #19
lazybiz,
Цитата Сообщение от lazybiz Посмотреть сообщение
-=ЮрА=-, что-то я не понял... ты написал что моё решение неверное, при этом привел пример скриншота своей программы которая выдает неправильные результаты.. Что ты этим хотел сказать?
Я поправил свой код, да по невнимательности бросил недоведенный алгоритм, и?
Или это неверное решение ?
Или может быть это верное решение?
http://codepad.org/41U1BCLD
Output:
99 = 33 + 33 + 33

Не по теме:

lazybiz, мой код - это последний пост в данной теме, который абсолютно корректен, твой код генит два, три (в случае кратного 3-м) одинаковых числа, заданию это явно противоречит где речь ведётся не о 3-х одинаковых а о 3-х близких числах

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 16:08     Представьте число в виде суммы трех приблизительно равных натуральных чисел
Еще ссылки по теме:

Число в виде суммы квадратов натуральных чисел C++
Определить, можно ли представить число в виде суммы двух квадратов натуральных чисел C++
Определить, можно ли представить число N в виде суммы кубов трех натуральных чисел C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
16.06.2013, 16:08     Представьте число в виде суммы трех приблизительно равных натуральных чисел #20
Цитата Сообщение от darkstalker739 Посмотреть сообщение
Плавающей точки также быть не должно. Только целочисленные вычисления т.е. int онли
её и так в ответах нет она только для упрощения чтобы выкинуть ветвления
хотя Thinker другой вариант предложил, тоже ничего себе
Цитата Сообщение от Thinker Посмотреть сообщение
ost = a % 3;
x += !!ost;
y += !(ost & 1);
лихо признаю
только у меня подозрение насчет
!!ost;
оптимизатор не выкинет?
можно так
C++
1
 x += (ost!=0);
да и прокомментировать, не все поймут что это за шаманство
Yandex
Объявления
16.06.2013, 16:08     Представьте число в виде суммы трех приблизительно равных натуральных чисел
Ответ Создать тему
Опции темы

Текущее время: 09:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru