CSES Solutions Weird Algorithm (original) (raw)

Last Updated : 16 Mar, 2024

Consider an algorithm that takes as input a positive integer **N. If **N **is even, the algorithm divides it by two, and if **N is **odd, the algorithm multiplies it by three and adds one. The algorithm repeats this, until N is one. Your task is to simulate the execution of the algorithm for a given value of N.

**Examples:

**Input: N = 13
**Output: 13 40 20 10 5 16 8 4 2 1
**Explanation:

**Input: N = 5
**Output: 5 16 8 4 1
**Explanation:

**Approach: To solve the problem, follow the below idea:

The problem can be solved by running a while loop till **N is not equal to 1. Inside the while loop, check if **N is odd then multiply it by 3 and add 1 to it otherwise if **N is even then divide it by 2.

Step-by-step algorithm:

Below is the implementation of algorithm:

C++ `

#include <bits/stdc++.h> #define ll long long int

using namespace std; int main() { ll N = 13; while (N != 1) { cout << N << " "; // If N is odd, then multiply it by 3 and add 1 if (N & 1LL) N = N * 3 + 1; // If N is even, divide it by 2 else N /= 2; } cout << 1; }

Java

public class Main { public static void main(String[] args) { long N = 13; while (N != 1) { System.out.print(N + " "); // If N is odd, then multiply it by 3 and add 1 if (N % 2 != 0) N = N * 3 + 1; // If N is even, divide it by 2 else N /= 2; } System.out.print(1); } }

C#

using System;

class GFG { public static void Main (string[] args) { // Declare and initialize N long N = 13;
// Continue the loop until N becomes 1 while (N != 1) { // Print the current value of N Console.Write (N + " "); if ((N & 1) == 1) N = N * 3 + 1; // If N is even divide it by 2 else N /= 2; }
// Print the final value of N (1) Console.Write (1); } }

JavaScript

let N = 13; let output = '';

while (N !== 1) { output += N + ' ';

// If N is odd, then multiply it by 3 and add 1
if (N & 1) {
    N = N * 3 + 1;
} 
// If N is even, divide it by 2
else {
    N /= 2;
}

}

output += '1'; console.log(output);

// Note: output variable is used to display result in a single line.

Python3

def main(): N = 13 while N != 1: print(N, end=" ")
# If N is odd, then multiply it by 3 and add 1 if N % 2 != 0: N = N * 3 + 1 # If N is even, divide it by 2 else: N //= 2 print(1) # Print the final value of 1

if name == "main": main()

`

Output

13 40 20 10 5 16 8 4 2 1

**Time Complexity: O(N)
**Auxiliary Space: O(1)