Witam! Niedawno zacząłem swoją przygodę z C#. Mam do napisania program, który będzie sumował liczby nieparzyste z danego przedziału. Napisałem go, wg mnie jest wszystko ok (ale mogę się mylić, jestem początkujący), ale niestety wyniki są nieprawidłowe. Oto kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Suma_liczb_nieparzystych
{
class Program
{
static void Main(string[] args)
{
int a, b, suma;
suma = 0;
Console.WriteLine("Podaj dolną granicę przedziału dodawania: ");
a = int.Parse(Console.ReadLine());
Console.WriteLine("Podaj górną granicę przedziału dodawania: ");
b = int.Parse(Console.ReadLine());
if ((a % 2) == 0)
{
a = (a + 1);
do
{
suma = (suma + a);
a = (a + 2);
}
while ((a - 1) >= b);
}
else
{
do
{
suma = (suma + a);
a = (a + 2);
}
while ((a - 1) >= b);
}
Console.WriteLine("Suma liczb nieparzystych z danego przedziału wynosi: " + suma);
Console.Read();
}
}
}
Jejku faktycznie, zapomniałem że jest to ciąg arytmetyczny z różnicą dwa, ale gapa ze mnie Okej, teraz już wszystko rozumiem tylko mam mały problem - przy kompilacji podaje mi błąd, że operator ! nie może być zastosowany do operandu typu int.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Suma_liczb_nieparzystych
{
class Program
{
static void Main(string[] args)
{
int a, b, suma;
suma = 0;
Console.WriteLine("Podaj dolną granicę przedziału dodawania: ");
a = int.Parse(Console.ReadLine());
Console.WriteLine("Podaj górną granicę przedziału dodawania: ");
b = int.Parse(Console.ReadLine());
suma = ((!(a % 2) ? 1 + a : a) + !(b % 2) ? b - 1 : b) / 2 * (b - a / 2 + 2);
Console.WriteLine("Suma liczb nieparzystych z danego przedziału wynosi: " + suma);
Console.Read();
}
}
}
To jest jakiś konkurs na najbardziej nieczytelny kod? Jaki jest sens stosować operator trójargumentowy, skoro w jednym przypadku zupełnie niczego nie zmieniasz? Gdybyś takie coś napisał u mnie w pracy, to następnego dnia musiałbyś za karę chodzić po firmie tuląc różowego jednorożca. Napisałeś to tak nieczytelnie, że sam się w tym gubisz i nie wiesz czemu źle liczy. Dlaczego na siłę chcesz to wcisnąć w jedną linijkę?
using System;
namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Podaj dolną granicę przedziału dodawania: ");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("Podaj górną granicę przedziału dodawania: ");
int b = int.Parse(Console.ReadLine());
// jeśli liczby są parzyste, trzeba coś z tym zrobić:
if (a % 2 == 0)
a += 1;
if (b % 2 == 0)
b -= 1;
int n = ((b - a) / 2 + 1); // liczba liczb nieparzystych między a i b
int suma = ((a + b) / 2) * n; // z wzoru, który wszyscy znają
Console.WriteLine("Suma liczb nieparzystych z danego przedziału wynosi: " + suma);
Console.Read();
}
}
}
Jestem zwolennikiem optymalizacji, na to samo wyjdzie jednak bez if’ów:
using System;
namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Podaj dolną granicę przedziału dodawania: ");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("Podaj górną granicę przedziału dodawania: ");
int b = int.Parse(Console.ReadLine());
int suma=((b+=b&1)*b-(a-=a&1)*a)>>2; // rozpisane niżej
//a-=a&1;
//b+=b&1;
//int suma=(b*b-a*a)>>2;
Console.WriteLine("Suma liczb nieparzystych z danego przedziału wynosi: " + suma);
Console.Read();
}
}
}