Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
darkstalker739
17 / 17 / 2
Регистрация: 16.06.2013
Сообщений: 94
1

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

16.06.2013, 13:52. Просмотров 1908. Ответов 39
Метки нет (Все метки)

Задание: Дано натуральное число 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.
Как можно реализовать проверку и дополнение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2013, 13:52
Ответы с готовыми решениями:

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

Определить, можно ли число представить в виде суммы квадратов трех натуральных чисел
Дано натуральные число n . Можно ли представить его в виде суммы трех квадратов...

Выяснить, можно ли представить данное число в виде суммы трех квадратов натуральных чисел
Дано натуральное число n. Можно ли представить его в виде суммы трех квадратов...

Дано натуральное число n. Можно ли представить его в виде суммы трех квадратов натуральных чисел?
Подскажите как правильно составить программу к этим задачам: 1.Дано...

Представить целое число N в виде суммы M примерно равных целых чисел.
В голове не приходит нормального решения. Именуйте темы осмысленно! Название...

39
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 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;
}
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;
}
0
Миниатюры
Представьте число в виде суммы трех приблизительно равных натуральных чисел  
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 14:45 4
-=ЮрА=-, 33 + 32 + 34 = 100 ??

Добавлено через 25 секунд
3 + 1 + 5 = 11 ???
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 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;
}
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 15:01 6
Thinker, просто я его привел как самое простое решение..
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:06 7
lazybiz, не спорю, простое решение, но числа не наиболее близки друг другу могут получиться, вот и подправил, теперь все случаи рассмотрены)
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,852
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;
}
разница должна быть не больше единицы
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:14 9
Цитата Сообщение от ValeryS Посмотреть сообщение
два числа должны быть одинаковы третье может отличатся на 1 или 2
наиболее близки, значит в этой задаче максимум на 1 должны отличаться)
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,852
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;

по моему так
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
16.06.2013, 15:34 11
Цитата Сообщение от ValeryS Посмотреть сообщение
Thinker,
вторую прогу смотрел?
зачем так усложнять, когда все проще можно и без чисел с плавающей точкой
0
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,852
16.06.2013, 15:37 12
Цитата Сообщение от Thinker Посмотреть сообщение
зачем так усложнять, когда все проще можно и без чисел с плавающей точкой
это не усложнение а упрощение
ни одного ветвления значит выполнятся будет быстрей
времена когда вещественная арифметика долго выполнялась прошли
если нужно чтобы три числа не были равные то можно добавить так
C++
1
2
3
4
5
if(A==B && B==C)
{
 A--;
 C++;
}
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 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;
}
1
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 онли
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
16.06.2013, 15:45 15
Цитата Сообщение от darkstalker739 Посмотреть сообщение
Значение должен вводить пользователь. Оно может быть любым.
Вводи любое, кто ж тебе мешает.
0
-=ЮрА=-
Заблокирован
Автор 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, просто я его привел как самое простое решение..
- перед словом решение добавь слово неверное

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

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

Не по теме:

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

1
ValeryS
Модератор
7315 / 5558 / 704
Регистрация: 14.02.2011
Сообщений: 18,852
16.06.2013, 16:08 20
Цитата Сообщение от darkstalker739 Посмотреть сообщение
Плавающей точки также быть не должно. Только целочисленные вычисления т.е. int онли
её и так в ответах нет она только для упрощения чтобы выкинуть ветвления
хотя Thinker другой вариант предложил, тоже ничего себе
Цитата Сообщение от Thinker Посмотреть сообщение
ost = a % 3;
x += !!ost;
y += !(ost & 1);
лихо признаю
только у меня подозрение насчет
!!ost;
оптимизатор не выкинет?
можно так
C++
1
 x += (ost!=0);
да и прокомментировать, не все поймут что это за шаманство
1
16.06.2013, 16:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2013, 16:08

Число в виде суммы квадратов натуральных чисел
Дано натуральное число. Составить программу, которая представит данное число в...

Можно ли представить данное число в виде произведения трех последовательных натуральных чисел
Помогите пожалуйста решить задачи на С++ 2) (Функция) Дано натуральное число...

Даны натуральное число n. Среди чисел 1, 2, …, n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел.
Собственно само задание. 5). Даны натуральное число n. Среди чисел 1, 2, …,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru