Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2020, 11:11   #1
Никоалй
Новичок
Джуниор
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию C# не понятна работа оператора "sum += i"

Есть вот такая функция, которая проверяет, является ли число нарцисстическим. Т.е. сумма степеней цифр из которых оно состоит (степень равна количеству цифр в числе), равна самому числу.

Console.WriteLine - все используются для поиска ошибки
Все примеры выполняю на сайте sololearn во встроенном code playground
Задача с сайта Codewars

sum += (int) Math.Pow(i, degree); // в этой строке ошибка

Точнее даже так.

// sum += i; - я использовал эту строку для дебага. i принимает правильное значение, а вот sum - какое-то вообще рандомное число, не понятно откуда берется.

// Получаю вот такой вывод:
// value = 1634
i = 1
sum = 49
i = 6
sum = 103
i = 3
sum = 154
i = 4
sum = 206
False = 206 == 1634
False

// Или вот ещё пример
// value = 153
i = 1
sum = 49
i = 5
sum = 102
i = 3
sum = 153
True = 153 == 153
True


Код:
          public static bool Narcissistic(int value)
          {
              string number = Convert.ToString(value);
              int degree = number.Length;
              int sum = 0;
             // bool result = false;
              
              foreach (var i in number)
              {
                  Console.WriteLine("i = " + i);
                  sum += i;
                //  sum += (int) Math.Pow(i, degree);
                  Console.WriteLine("sum = " + sum);
              }
              
              bool result = sum == value? true : false;
              Console.WriteLine(result + "  = {0} == {1}", sum, value);
              return result;
          }
Подскажите, кто понимает в чём дело? Почему оператор "sum += i..." работает именно так, а не как я этого ожидаю? Ошибки, как таковой в компилляторе нет, но результат не верный.

Последний раз редактировалось Никоалй; 04.03.2020 в 11:33.
Никоалй вне форума Ответить с цитированием
Старый 04.03.2020, 11:47   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

К Int додаете Char?

49 - ASCII код "1"
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.

Последний раз редактировалось Aleksandr H.; 04.03.2020 в 11:52.
Aleksandr H. вне форума Ответить с цитированием
Старый 04.03.2020, 11:51   #3
Никоалй
Новичок
Джуниор
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
К Int додаете Char?
Я пробовал писать по разному:
Код:
sum += (int) i;
И так:
Код:
sum += Convert.ToInt32(i);
И так как в первом сообщении:
Код:
sum += i;
Проблему это не решает. Результат везде одинаков.

Последний раз редактировалось Никоалй; 04.03.2020 в 11:51. Причина: опечатки
Никоалй вне форума Ответить с цитированием
Старый 04.03.2020, 11:53   #4
Никоалй
Новичок
Джуниор
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

А ещё попробовал написать так:
Код:
sum =(int) i;
Получил такой вывод:
i = 1
sum = 49
i = 6
sum = 54
i = 3
sum = 51
i = 4
sum = 52
False = 52 == 1634
False

Т.е. после работы этого оператора получается число около 50+-

Это так и должно быть вообще? Или это проблема компиллятора, встроенного в сайт?

Последний раз редактировалось Никоалй; 04.03.2020 в 11:54. Причина: Дополнительный вопрос
Никоалй вне форума Ответить с цитированием
Старый 04.03.2020, 14:12   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Код:

public static bool Narcissistic(int value)
		{
			string number = Convert.ToString(value);
			int degree = number.Length; //длина числа в символах
			double sum = 0;
				
			int iteration=1;
			Console.WriteLine("LENGTH CHISLA = " + degree.ToString()+" SYMBOL(S)");
			
			foreach (var i in number)
			{
				Console.WriteLine("\niteration " + iteration);
				Console.WriteLine("i = " + i);
				
				double stepen=Math.Pow(i-48,degree);
				Console.WriteLine("stepen  = ("+i+" ^ "+degree+") = " + stepen);
				sum+=stepen;
				
				Console.WriteLine("sum stepenei na iteracii "+iteration+ " = " + sum.ToString());
				iteration++;
			}
			
			bool result = sum == value? true : false;
			Console.WriteLine("\n"+result + "  = {0} == {1}", sum, value);
			return result;
		}
		
		public static void Main(string[] args)
		{
			
			Console.WriteLine("Введите число: ");
			
			Console.WriteLine(	 Narcissistic(Convert.ToInt32(Console.ReadLine()))) ;
			
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
		}
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 04.03.2020, 14:16   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Никоалй Посмотреть сообщение
А ещё попробовал написать так:
и так пробовали?
Код:
sum += Convert.ToInt32(i.ToString());
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 04.03.2020, 14:37   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

По факту добавил переменную степени текущей итерации цикла, и сумму которая запоминает сумму всех степеней отдельной цифры

i-48 - это преобразование символа в число, иначе будет некорректный счет, посмотрите как выводится sum при суммировании с i, будет на 48 больше всегда

Код:
                                double stepen=Math.Pow(i-48,degree);
				Console.WriteLine("stepen  = ("+i+" ^ "+degree+") = " + stepen);
				sum+=stepen;
так же можно запретить ввод в консоль всех символов кроме цифр для более корректной работы функции
Код:
	public static void Main(string[] args)
		{
                        Console.ForegroundColor = ConsoleColor.Green;
			Console.BackgroundColor = ConsoleColor.Black;
			
			Console.WriteLine("Введите число: ");
			
			string chislo = Console.ReadLine();
			string ch="";
			
			for (int i=0;i<chislo.Length;i++)
				if (chislo[i]>='0'&&chislo[i]<='9')
					ch+=chislo[i];

			
			Console.WriteLine(	 Narcissistic(Convert.ToInt64(ch))) ;
			
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
		}

вот общий код работы всей программы функцию вызываем в main, но перед этим делаем искусственный контроль ввода
так же для более легкого просмотра можно разукрасить данные в консоли в чередующийся цвет при выводе, а так же цвет подведения итога в отличный от них цвет
Код:
		public static bool Narcissistic(long value)
		{
			string number = Convert.ToString(value);
			int degree = number.Length; //длина числа в символах
			double sum = 0;
			
			int iteration=1;
			Console.WriteLine("LENGTH CHISLA = " + degree.ToString()+" SYMBOL(S)");
			
			foreach (var i in number)
			{
				
				if ((iteration+1)%2==0) Console.ForegroundColor = ConsoleColor.Green; else
				Console.ForegroundColor = ConsoleColor.Yellow;
				
				Console.WriteLine("\niteration " + iteration);
				Console.WriteLine("i = " + i);
				
				double stepen=Math.Pow(i-48,degree);
				Console.WriteLine("stepen  = ("+i+" ^ "+degree+") = " + stepen);
				sum+=stepen;
				
				Console.WriteLine("sum stepenei na iteracii "+iteration+ " = " + sum.ToString());
				iteration++;
				
				
			}
			
			bool result = sum == value? true : false;
			Console.ForegroundColor = ConsoleColor.Blue;
			Console.WriteLine("\n"+result + "  = {0} == {1}", sum, value);
			return result;
		}
		
		
		public static void Main(string[] args)
		{
			
			Console.WriteLine("Введите число: ");	
					
			string chislo = Console.ReadLine();
			string ch="";
			
			for (int i=0;i<chislo.Length;i++)
				if (chislo[i]>='0'&&chislo[i]<='9')
					ch+=chislo[i];		
			
			Console.WriteLine(	 Narcissistic(Convert.ToInt64(ch))) ;
									
		
			Console.ForegroundColor = ConsoleColor.Red;
			Console.Write("Press any key to continue . . . ");
			
			Console.ReadKey(true);
		}
from dark to light)

Последний раз редактировалось Алексей_2012; 04.03.2020 в 15:23.
Алексей_2012 вне форума Ответить с цитированием
Старый 04.03.2020, 15:46   #8
Никоалй
Новичок
Джуниор
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

Aleksandr H.,
Цитата:
и так пробовали?
Код:
Код:
sum += Convert.ToInt32(i.ToString());
Да! Это сработало! Спасибо за помощь!
Вот только я не до конца понял, почему именно так? Может сможете объяснить? Или есть ссылка на статью?

Последний раз редактировалось Никоалй; 04.03.2020 в 15:51. Причина: Вставил цитату
Никоалй вне форума Ответить с цитированием
Старый 04.03.2020, 15:56   #9
Никоалй
Новичок
Джуниор
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Алексей_2012 Посмотреть сообщение
i-48
Спасибо! Я думал о таком способе решения, после Вашей подсказки попробовал в своем коде вставить "i-48" и всё успешно сработало! Решение было зачтено!

В принципе я попробовал ещё способ, предложенный Александром
Код:
sum += Convert.ToInt32(i.ToString());
Я примерно понял, что это как-то связано с кодировкой символов в строке. Возможно возвращается не сам символ, а какой-то его код. Я просто ещё мало знаю, чтобы чувствовать такие тонкие материи. Но вот с этим хоть разобрался. Там у меня была ещё одна похожая задача, где числа из строки надо выбирать, там такая же проблема, но теперь я уже знаю как её решить!

Спасибо!
Никоалй вне форума Ответить с цитированием
Старый 04.03.2020, 15:59   #10
Никоалй
Новичок
Джуниор
 
Регистрация: 04.03.2020
Сообщений: 7
По умолчанию

Мой вопрос считаю решённым. Тему можно закрывать.

Выражаю благодарность Александру и Алексею за предложенные решения! Оба способа оказались рабочими!
Никоалй вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Ошибка "Expecting a valid name" для оператора "<" в JScript Ратибор Редоран JavaScript, Ajax 0 15.12.2011 14:38