3n+1 неправильный ответ в соответствии с uva onlinejudge
Я пытаюсь решить вопрос "3n+1" и отправить его на uva onlinejudge, но каждый раз, когда он говорит, что мой код дает неправильный ответ, и, к сожалению, я не могу найти его проблему, вот вопрос: Проблема 100
Мой код:
#include <stdio.h>
int main()
{
unsigned long int n, m;
int max = 0;
scanf("%d %d", &n, &m);
int i;
for (i = n; i <m + 1; i++)
{
int ter = i;
int counter = 1;
while (ter != 1)
{
counter++;
if (ter % 2 == 1) { ter = 3 * ter + 1; }
else
ter = ter / 2;
if (ter == 1)
if (counter>max) { max = counter; }
}
}
printf("%d %d %d\n", n, m, max);
return 0;
}
4 ответа
Проблема понятна. Вы не следуете инструкциям из постановки проблемы
Для любых двух чисел i и j вы должны определить максимальную длину цикла по всем числам между i и j.
Входные данные будут состоять из серии пар целых чисел i и j, по одной паре целых чисел на строку. Все целые числа будут меньше 1 000 000 и больше 0.
- Вы читаете только одну строку ввода и печатаете этот ответ
- Вы предполагаете, что
i
меньше чемj
Следующая функция выполняет запрошенный расчет:
void n3plus1(int min, int max)
{
int i, n, len, lenmax=0;
for (i=min; i<=max; i++)
{
n= i; len= 1;
while (n!=1) {
if (n&1)
n= 3*n + 1;
else n= n/2;
len++;
}
if (len>lenmax) lenmax= len;
}
printf("Answer: %d %d %d\n", min,max,lenmax);
}
Со следующими тестами:
void test(void)
{
n3plus1(22, 22);
n3plus1(1, 10);
n3plus1(100, 200);
n3plus1(201, 210);
n3plus1(900, 1000);
}
выход:
Answer: 22 22 16
Answer: 1 10 20
Answer: 100 200 125
Answer: 201 210 89
Answer: 900 1000 174
Примечание: "максимальная длина цикла для всех чисел от i до j" в постановке задачи должна интерпретироваться как включающая i
а также j
,
Код предполагает i<=j
на входе. Код исключает чтение ввода.
Правильное решение:
#include <stdio.h>
int cycleSize(int x) {
int cycle = 1;
while (x != 1) {
if (x % 2 == 0) { //if even
x = x / 2;
} else { //if odd
x = x * 3 + 1;
}
++cycle;
}
return cycle;
}
int maxCycleSizeBetween(int a, int b) {
if (a > b) { //if b > a, swap them
int temp = a;
a = b;
b = temp;
}
int maxCycle = 0;
for (; a <= b; a++) {
int thisCycleSize = cycleSize(a);
if (thisCycleSize > maxCycle) {
maxCycle = thisCycleSize;
}
}
return maxCycle;
}
int main() {
int a, b; //input vars
while (scanf("%d %d", &a, &b) != EOF) {
printf("%d %d %d\n", a, b, maxCycleSizeBetween(a, b));
}
return 0;
}
Следующий код реализует требования
Тем не менее, некоторые онлайн-конкурсы кода ожидают окончательной пустой строки. Вам нужно будет определить такие детали.
#include <stdio.h>
int main( void )
{
size_t n1;
size_t m1;
char buffer[1024];
while( fgets( buffer, sizeof(buffer), stdin ) )
{
if( 2 != sscanf(buffer, "%lu %lu", &n1, &m1) )
{
break;
}
size_t n = n1;
size_t m = m1;
if( n1 > m1 )
{ // then first number greater than second so reverse for calculations
size_t temp = n;
n = m;
m = temp;
}
size_t maxCount = 0;
for (size_t i = n; i <= m; i++)
{
size_t ter = i;
size_t counter = 1;
while (ter != 1)
{
counter++;
if ( (ter & 0x01) == 1)
{ // then odd
ter = 3 * ter + 1;
}
else
{ // else even
ter = ter / 2;
}
// for testing only
// printf( "%lu: %lu, %lu\n", counter, i, ter );
}
if( maxCount < counter )
{
maxCount = counter;
}
}
printf("%lu %lu %lu\n", n1, m1, maxCount);
}
}
Замечания:
- этот код завершится, если введено не числовое значение
- этот код завершится, если EOF встретился - это ожидается
- однако этот код не будет выполнен, если введено отрицательное число; В соответствии с условиями конкурса, числа должны быть в диапазоне 1...1000000, поэтому не нужно проверять наличие отрицательных чисел.
- этот код будет выходить, если только одна цифра в строке ввода
- этот код выйдет, если только
<cr>
введен