Loading...
Termidor avatar Termidor 0 Точки

Coding 101 Exam - 26 March 2016 Задача 06 - Магически числа

Здравйте,

решавайки задачите от изпита на 26 март виждам трудност в 6та задача. Видях авторското решение и го разбрах, но опитвайки се да я реша сам тръгнах по друг път. Така и не мога да разбера къде греша , ако може някой да погледне кода и да ми каже.Условието е следното:

Да се напише програма, която въвежда едно цяло „магическо“ число и изкарва всички възможни 6-цифрени числа, за които произведението на неговите цифри е равно на „магическото“ число.

Пример: „Магическо число“ -> 2

  • 111112 -> 1 * 1 * 1 * 1 * 1 * 2 = 2
  • 111121 -> 1 * 1 * 1 * 1 * 2 * 1 = 2
  • 111211 -> 1 * 1 * 1 * 2 * 1 * 1 = 2
  • 112111 -> 1 * 1 * 2 * 1 * 1 * 1 = 2
  • 121111 -> 1 * 2 * 1 * 1 * 1 * 1 = 2
  • 211111 -> 2 * 1 * 1 * 1 * 1 * 1 = 2

Вход

Входът се чете от конзолата и се състои от едно цяло число в интервала [1600000].

Изход

На конзолата трябва да се отпечатат всички магически” числа, разделени с интервал.

 

Това е моето решение:

 

namespace Задача_06___Магически_числа
{
    class Program
    {
        static void Main(string[] args)
        {
            int magicNumber = int.Parse(Console.ReadLine());
            int proizv = 1;

            for (int i = 100000; i <= 999999; i++)
            {
                
                int n = i;

                do
                {
                    proizv = proizv * (n % 10);
                    n = n / 10;
                } while (n > 0);

                if (proizv == magicNumber)
                {
                    Console.Write("{0} " , i);
                }
                  
            }
        }
    }
}
 

Тагове:
0
Programming Basics
puffed avatar puffed 289 Точки
Best Answer

Трябва за всяко ново число i да зануляваш proizv към 1. Ето така например (смених имената на променливите):

for (int i = 100000; i <= 999999; i++)
        {
            result = 1;
            int num = i;
            do
            {
                result = result * (num % 10);
                num = num / 10;
            } while (num > 0);

            if (result == magicNumber)
            {
                Console.Write("{0} " , i);
            }

        }

0
Termidor avatar Termidor 0 Точки

Много благодаря :) Усещах , че е нещо много малко , но така и не успях да го видя сам...а то като проследиш логиката на кода и се вижда лесно. Просто ми е убягнало. Отново благодаря!

0
puffed avatar puffed 289 Точки

Моля, няма защо. Успех!

0
Termidor avatar Termidor 0 Точки

Благодаря!

0
AntyfrizZz avatar AntyfrizZz 238 Точки

Здравей,

 

След всяка проверка дали proizv == magicNumber трябва да сетваш proizv = 1.

Малко оптимизации (и без тях ще си вземеш точките)

Цикъла ти трябва да започва от 111111. Всичко преди това е празен ход (умножаваш по 0)

В do тялото сложи проверка, ако proizv == 0, break; Така ако умножиш по 0, ще приключиш с умножението и ще продължиш със следващата итерация.

Вместо да принтираш на всяка итерация използваш StringBuilder. Google it ако не знаеш какво е.

И... proizv? НЕ си кръщавай променливите така.

 

Поздрави!

0
Termidor avatar Termidor 0 Точки

Благодаря ти за отговора и още повече за оптимизациите. За някои неща се досетих , но понеже правих симулация на изпит и се стараех да постигна макс точки за 4 часа, а много от  скоро се занимавам и все още тези неща ми отнемат време да ги помисля.За това и не стигнах дотам. Но ти благодаря за градивната критика и ще ги имам впредвид smiley.

0
koksibg avatar koksibg 892 Точки

Малко късен отговор, виждам, че са ти отговорили,където е единият от вариантите, а другият е с 6 вложени цикли и една проверка за умножение.

0
Termidor avatar Termidor 0 Точки

Благодаря за вниманието все пак!

0
Termidor avatar Termidor 0 Точки

Ще го погледна , благодаря!

0
DimitarKarev avatar DimitarKarev 87 Точки

Ето решение с вложени цикли:


 var n = int.Parse(Console.ReadLine());
 for (int i1 = 1; i1 <=9; i1++)
 for (int i2 = 1; i2 <= 9; i2++)
 for (int i3 = 1; i3 <= 9; i3++)
 for (int i4 = 1; i4 <= 9; i4++)
 for (int i5 = 1; i5 <= 9; i5++)
 for (int i6 = 1; i6 <= 9; i6++)
 if (i1 * i2 * i3 * i4 * i5 * i6 == n)
 Console.Write($"{i1}{i2}{i3}{i4}{i5}{i6} ");

 Console.WriteLine();
  
 

0
01/09/2016 12:35:53
traykova44 avatar traykova44 93 Точки

Здравейте, прегледах тук посоченото решение както и друг тип този  https://pastebin.com/tmmqE598

Не мога да разбера на какъв принцип се решават този тип задачи.

Гледам в едиото решени 999999 , в другото цикъл до 9 .

Не мога да разбера защо 9 .Отговора е 6 числа, има 7 цикъла ,а  for (int x1 = 0; x1 <= 9; x1++)  до 9 ?

Защо?

Благодаря предварително, ако някой може да ми обесни!

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