Member 13476370 Ответов: 2

Напишите рекурсивную функцию threeplustwo, которая принимает аргумент (n), суммирует все числа, делящиеся на 2 + все числа, делящиеся на 3 из диапазона(от 1 до n-1).


это типовой код ответа (который я не понимаю )

int threePlusTwo (int n)
{
if (n <= 2)
return 0;
if (n == 3)
return 2;
int twoSum = (n - 1) % 2 == 0? (n - 1): 0;
int threeSum = (n - 1) % 3 == 0? (n - 1): 0;
return twoSum + threeSum + threePlusTwo(n - 1);
}


Что я уже пробовал:

#include<stdio.h>
#include<stdlib.h>
int tpt(int n)
{
    if(n==1) return 0;
    if(n%3==0||n%2==0) return n+tpt(n-1);

    return tpt(n-1);
}

проблема с моим кодом заключается в том, что тестовый случай n>=6 суммирует 6 только один раз из-за условия||...есть идеи как это сделать измените мой код, чтобы пройти этот тестовый случай?!

CHill60

Что такого есть в ответе модели, что вы не понимаете - вы использовали все конструкции в своем собственном коде, кроме тернарного/условного оператора ?: - Как использовать условный (тернарный) форум ope - C++ [^]

2 Ответов

Рейтинг:
2

CPallini

Имейте в виду, что вы должны рассмотреть (n-1) как верхний предел Давайте посмотрим, как можно было бы интепретировать модельную программу

if (n <= 2)
  return 0;
Это тривиально, так как 1 не делится на 2 или 3.

if (n == 3)
  return 2;
Это тоже тривиально, так как в 1,2 последовательность, есть только 2 которое делится без остатка.

int twoSum = (n - 1) % 2 == 0? (n - 1): 0;
Это средство
int twoSum;
if ( (n-1) % 2 == 0)
  twoSum = (n-1);
else
  twoSum = 0;

То есть "если (n-1) делится на 2 затем сохраните его, чтобы добавить к сумме".

Интепретация
int threeSum = (n - 1) % 3 == 0? (n - 1): 0;
схожий.

return twoSum + threeSum + threePlusTwo(n - 1);
Это делает трюк сложения двух раз числа, которое делится как на 2 и 3 (обратите внимание, что такое требование не очевидно из названия вопроса).


Member 13476370

хорошо ... но есть ли какой-то способ изменить мой код, чтобы пройти этот тестовый случай

Рейтинг:
1

KarstenK

Вы должны понять смысл текста вашего домашнего задания и перевести его в код:

"от диапазона (1 до n-1)" переводится как:

for( int i = 1; i < n; i++ ) {
  //do magic stuff
}

"суммируйте все числа, делимые на 2" (некоторые магические вещи)
if( (i %2) == 0) ) // % is modulo operator
{
  sum = summ + n;
}

Совет: используйте оператор else if для части 3.

Удачи вам с домашними заданиями. И напишите несколько тестов для проверки правильных результатов.


Richard MacCutchan

Я думаю, что так и должно быть sum = sum + i;

Member 13476370

но как изменить мой код, чтобы пройти этот тестовый случай