Loading...
Anjela_Aleksandrova avatar Anjela_Aleksandrova 71 Точки

Problem 5.Special Numbers?

Здравейте, исках да попитам за задача 5-та от втората лекция - Data Types and Methods.Не разбирам частта с while-цикъла, ако може някой да разясни ще е супер.smiley Ето го и кода: http://pastebin.com/m1LuWjNK .

Тагове:
2
Programming Fundamentals 24/05/2016 20:28:43
ralitsa_d avatar ralitsa_d 171 Точки

Здравей, в while цикъла сумираш отделните цифри на числото. За целта използваш деление с остатък (оператор %) и целочислено деление (оператор /). Деление с остатък означава, че взимаш само остатъкът от делението (13 % 10 = 3), а целочислено - че взимаш само цялата част (13 / 10 = 1).

За да получиш цифрата на единиците на дадено число, рябва да разделиш с остатък на 10. За да получиш всяка следваща цифра, делиш целочислено на 10, а след това отново делиш на 10 с остатък.

Ето и един пример: числото 163: 163 % 10 = 3 -> прибавяме 3 към сумата: sum = 3. 163 / 10 = 16; 16 % 10 = 6 -> прибавяме 6 към сумата: sum = 3 + 9; 16 / 10 = 1, 1 % 10 = 1 -> прибавяме 1 към сумата: sum = 3 + 6 + 1.

Операторът += е кратък запис на събиране. Вместо да пишеш sum = sum + 3, записваш само sum += 3.

Тук е обяснена разликата между целочислено деление и деление с остатък и е обяснен алгоритъма за намиране на цифрите на дадено число.

4
Anjela_Aleksandrova avatar Anjela_Aleksandrova 71 Точки

Мисля,че го разбрах.Благодаря! 

0
indieza avatar indieza 46 Точки

Здравей колега,

Ако трябва да говорим за стилизиран код бих ти препоръчала моя. Разгледай го дано да ти помогне.  

1
mgerin avatar mgerin 4 Точки

Колега, този код наистина е стилизиран, но дава верен резултат само за двуцифрените числа. Станат ли трицифрени, вече сумата не е коректна.

0
slav.petkov avatar slav.petkov 26 Точки

Здравей, indieza,

добре изглежда кодът ти. Бих ти дал още няколко препоръки:

  1. bool isSpecial = firstDigit + lastDigit == 5 || firstDigit + lastDigit == 7 || firstDigit + lastDigit == 11;  Този ред би могъл да го пренапишеш по следния начин:

    int sumOfFirstAndLastDigit = firstDigit + lastDigit;
    bool isSumOfFirstAndLastDigitEqualToFive =
    (sumOfFirstAndLastDigit == 5);
    bool isSumOfFirstAndLastDigitEqualToSeven = (
    sumOfFirstAndLastDigit == 7);
    bool isSumOfFirstAndLastDigitEqualToEleven =
    (sumOfFirstAndLastDigit == 11);

    bool isSpecial = isSumOfFirstAndLastDigitEqualToFive || isSumOfFirstAndLastDigitEqualToSeven ||

                isSumOfFirtAndLastDigitEqualToEleven;

    Може да е по-дълго за писане, но ще улесниш себе си след време, когато си го четеш, пък и други хора, като нас, които искаме да ти помогнем.

    Горният дълъг израз лично на мен ми стоеше малко неясен, затова го разбих на три отделни израза. Скобите във всеки един от тях съм ги сложил, за да може този, който чте кода, да не губи време да се чуди какъв е приоритетът на операциите. Така МНОГО ясно подчертавам, че искам резултатът от сравнението да се присвои на променливата, а не първо да се присвои sumOfFirstAndlastDigits и чак тогава да се сравни с литерала.

     
  2. Console.WriteLine(i + " -> " + isSpecial);

    Това би могъл да го напишеш по следния начин:
    Console.WriteLine("{i} -> {isSpecial}");
    Пак стои по-четимо.
     

Браво, че се стараеш да пишеш стилизиран код.

ПРОДЪЛЖАВАЙ ТАКА!

Поздрави!

 

 

 

0
EmanuilNikolov avatar EmanuilNikolov 33 Точки

По принцип и мен малко ме обърка, но като се замислих излезе логично - ето и моето решение

с for loop определям броя завъртания, които ще се направят от 1 до n. с while loop сумата от цифрите на брояча - sum пази стойностите от % 10 - ("вземам" цифрите една по една) а с / 10 - заличавам предходната стойност и така докато не стигне 0. излизам от цикъла и проверявам дали сумата отговаря на условията и променям булевата стйност. Занулявам sum. Принтирам по условието и операцията се повтаря докато не се изпълни условието на for - loop. 

using System;

public class Program
{
	public static void Main()
	{
		Console.WriteLine(5 / 10);
		var n = int.Parse(Console.ReadLine());
		var check = false;
		var temp =0;
		//
		var sum =0;
		for(int i =1; i <=n; i++)
		{
			temp = i;
			while(temp!=0)
			{
				sum +=(temp % 10);
				temp/=10;
			}
			if(sum == 5 || sum == 7 || sum ==11)
			{
				check = true;
			}	
			else
				check = false;
			sum =0;				
			Console.WriteLine(i+" -> "+check);			
		}		
	}
}

 

1
E.Erol avatar E.Erol 13 Точки

Здравейте,
колегите са обеснили много добре частта с while-цикъла, но по принцип тази задача може да се реши и без този цикъл.
Ако на някой му е интересно, ето го моето решение : https://pastebin.com/v5SS0R4S 

1
Tyza4o avatar Tyza4o 3 Точки

Здравей!

Решението ти без while цикъл е вярно само за числа с до 2 цифри. Да минава проверката на Judge, но явно тестовете са само за двуцифрени числа, а firstDigit дори е излишно . При въвеждане на 3-цифрено число резултатите са грешни защото:

int firstDigit = middleDigit / 10;

дели 2-рата цифра от числото на 10, което винаги дава целочислен резултат 0. Първата цифра от 3-цифрено число би била коректна ако е сметната така :

int firstDigit = (num / 100) % 10;  или само: int firstDigit = num / 100; за трицифрени числа

Дори и така сметките няма да са валидни за 4 и повече цифрени числа, тъй като сумата е сбор от 3 променливи - т.е. само на 3 цифри!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.