aindrea
Member
- Joined
- Jun 5, 2018
- Messages
- 23
- Programming Experience
- 1-3
As I am learning C#, I have just written a programme which has the goal to read an integer in order to do prime factorization with it. So if it reads 49, the output is supposed to be 7 7. If it reads 8, the output is supposed to be 2 2 2
Here it is:
My question is: This seems to work for some numbers (like 49, 11, 12) but it does not work for e. g. 144. What is the cause of this?
Here it is:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace ConsoleApp1
{
class Program
{
private static ArrayList primes = new ArrayList();
private static ArrayList primes2 = new ArrayList();
private static ArrayList nonPrimes = new ArrayList();
private static ArrayList numbersToRemove = new ArrayList();
static void Main(string[] args)
{
Console.WriteLine("I want to do prime factorization with the natural number you enter; it still does not work as intended.");
var input = Console.ReadLine();
int number = 0;
try
{
number = Int32.Parse(input);
}
catch(System.FormatException)
{
Console.WriteLine("Please write a natural number, don't write a decimal or any gibberish.");
}
catch (System.OverflowException)
{
Console.WriteLine("The number you entered is so big that I cannot parse it.");
}
string res = factorize(number);
Console.WriteLine(res);
Console.WriteLine("Press any key to stop.");
Console.ReadLine();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
private static string factorize(int number)
{
if (isPrime(number)) {
primes.Add(number);
return string.Join(" ", primes.ToArray());
}
for (double i = 2; i < number; i++) {
if (isNatural((double)number / i) && !isPrime((int)(number / i)))
{
nonPrimes.Add((double)number / i);
}
if (isNatural((double)number / i) && isPrime((int)(number / i)))
{
primes.Add((double)number / i);
}
}
foreach (double n in nonPrimes) {
foreach (double p in primes) {
if(!isNatural(n / p)) {
numbersToRemove.Add(p);//Add these numbers to a List numbersToRemove,
}
}
}
foreach (double v in primes)
{
primes2.Add(v);
}
foreach (double r in numbersToRemove) {//And remove them from the original list.
primes2.Remove(r);
}
return string.Join(" ", primes.ToArray()) + " " + string.Join(" ", primes2.ToArray());
}
////////////////////////////////////////////////////////////////////////////////////////////////////
private static bool isNatural(double v)
{
return (v % 1) == 0;
}
private static bool isPrime(int numberToTest)
{
if (numberToTest == 1 && numberToTest == 2){
return true;
}
for (double d=2.0;d<numberToTest;d++){
if (numberToTest % d == 0){
return false;
}
}
return true;
}
}
/*
internal class ReverseSort : IComparer
{
public int Compare(object x, object y)
{
return Comparer.Default.Compare(y, x);
}
}
*/
}
My question is: This seems to work for some numbers (like 49, 11, 12) but it does not work for e. g. 144. What is the cause of this?
Last edited: