Софтуерно Инженерство
Loading...
+ Нов въпрос
yuletodim avatar yuletodim 37 Точки

[Exam Problems] C# Basics - Nine Digit Magic Numbers

Здравейте!

Започнах да решавам задачите от другите изпитни дати и явно, не мога да разбера условието на една от тях: Nine Digit Magic Numbers. Ако разбирам правилно става въпрос за 9 цифрени числа генерирани с цифрите от 1 до 7. Сумата на всички знаци трябва да е SUM, а разликта меджу първите 3 и вторите 3, и вторите 3 и третите 3 е DIFF, като първата тройка е < от втората, а тя е < от третата. Аз получавам много повече числа от тези в тестовете, но те отговарят на условията. Моля, някой, който е бил на този изпит да ми каже къде греша??

sum = 24

diff = 103

очакван резултат:

121224327
211314417

моят резултат:

112215318

115218321

118221324

121224327

211314417

 

 

ayatanasov avatar ayatanasov 5 Точки

Здравей ,  в твоя резултат има числа, които съдържат цифрата 8, а тя е забранена според условието.

1
Fleshian avatar Fleshian 378 Точки

Колегата е прав. Като махнеш числата които съдържат 8 в резултатa , outputa ще бъде точен. Можеби в някой от циклите си написала:
i <= 8 вместо  i < 8

1
yuletodim avatar yuletodim 37 Точки

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

0
a.polyanska avatar a.polyanska 107 Точки

Макар че е по-отдавнашна темата, ще си задам въпроса тук, защото мисля, че няма смисъл да отварям нова. Та след два дни мислене по тази задача на практика стъпка по стъпка - консултация с авторкото решение, та направо си я попреписах  Работата е, че пак не работи правилно програмата и не мога да разбера защо. Когато въвеждам данните от примера ми излиза резултат "No", въпреки, че би трябвало да изкарват магическите числа. Някой може ли да каже кое не съм догледала? (Хммм, даже преписването не ми се получава :))

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


    class NineDigitMagicNumbers
    {
        static void Main(string[] args)
        {
            int sum = int.Parse(Console.ReadLine());
           int diff = int.Parse(Console.ReadLine());
         
            int resultsCount = 0;
            for (int num1 = 111; num1 <= 777; num1++)
            {
               int num2 = num1 + diff;
                int num3 = num2 + diff;

                if (AllowedValues(num1) && AllowedValues(num2) && AllowedValues(num3) &&
                     num3 <= 777 && (SumOfDigits(num1) + SumOfDigits(num2)
                    + SumOfDigits(num3)) == sum)
                {
                    Console.WriteLine("{0}+{1}+{2}", num1, num2, num3);
                    resultsCount++;
                }
                
            }
            if (resultsCount == 0)
                    Console.WriteLine("No");

           
        }
   private static bool AllowedValues (int num)
   {
       string digits = num.ToString();
       while (num > 0)
       {
           foreach (var element in digits)
           {
               if (element < 1 || element > 7)
               {
                   return false;
               }
           }
           
       }return true;
   }
   private static int SumOfDigits(int num)
   {
       int sum = 0;
      
       while (num > 0)
       {
           
           sum += num % 10;
           num = num / 10;
       }
       return sum;
 
   }
   }

0
Filkolev avatar Filkolev 4428 Точки

На първо време виждам грешка в output-a - трябва да е Console.WriteLine("{0}{1}{2}", num1, num2, num3); без плюсовете. 

На мен ще ми трябва малко време да дебъгна, но опитай и ти междувременно да си намериш проблема с дебъгера. Тествай си методите дали ти работят на първо място. Вкарай им позволени и непозволени числа и виж дали връщат правилни резултати и дали смятат правилно сумата от цифрите.

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

 При теб е: if (element < 1 || element > 7)

Пробвай с: if (element < '1' || element > '7')

 Освен това този while в AllowedValues няма работа там. Ето го преправен и работещ кода ти:

04. NineDigitMagicNumbers

1
Filkolev avatar Filkolev 4428 Точки

Колегата е прав, ти превръщаш числото в стринг и реално взимаш символи в цикъла. Трябва да ползваш или ASCII номерацията ако искаш с < и > да работиш, или изрично да ги изпишеш непозволените, те са малко, така че е вариант. Не знам с начина  if (element < '1' || element > '7') дали ще се получи, изпитвам съмнения.

0
verito898 avatar verito898 SoftUni Team 290 Точки

И аз имам въпрос по тази задача

http://pastebin.com/R7iWH1pc -това е моето решение , но при пускане в judge системата ми дава лимит време .

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

 

0
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

В тази задача е излишно да се използват вложени цикли и заради това получаваш лимит от време. Много по-лесно е да се използва само 1 for цикъл от 111 до 777 и от i да се образуват останалите 6 цифри. Може да видиш този начин реализиран:

NineDigitMagicNumbers

 

1
boyanov avatar boyanov 65 Точки

Аз първо си го написах с много вложени цикли, и не ми даваше никакви грешки. Циклите не са чак толкова тежки колкото някои операции (например със стрингове).

1
verito898 avatar verito898 SoftUni Team 290 Точки

При мен  излизат вярно резултатите , но ми дава грешки във времето . Разбрах логиката на предното решение и е определено доста интересна , но просто исках да си я изкарам с моя си код .

0
dim4o avatar dim4o 288 Точки

Относно темата на колежката asyamincheva, която заключиха преди малко (предполагам, защото има няколко подобни теми).

Не се притеснявай. Според мен проблема не е в твоя телевизор и решението ти е напълно коректно. Проблемът е в условието: abc < def < ghi, което трябва да е abc <= def <= ghi. Затова ти гърми. Просто некоректно условие в judge системата. Сега видях, че е поправено в сайта на СофтУни, но judge-а е още грешното. Затова по-добре тегли задачите от сайта на Университета.

Дано видиш този пост, за да не си блъскаш напразно главата заради нещо което е вярно.

Поздрави и успех на изпита !

ПС: Аз също се бях подвел по грешното условие веднъж като решавах задачата, но просто го изтрих защото ако  num3 - num2 == diff && num2 - num1 == diff условието abc <= def <ghi е излишно (освен ако diff не е отрицатално). И така задачата си тръгна.

2
asyamincheva avatar asyamincheva 20 Точки

Да, и аз предположих, че грешката ми е, защото условието е излишно (след известно мислене над думите ти), но въпреки това нямаше как оттам да имам грешка... Благодаря ти много за обяснението, както и за пожеланията, наистина го оценявам! :) Силно се надявам да се справя :)

1
boyanov avatar boyanov 65 Точки

И аз се подведох от условието като я решавах :\ Добре че е лесна за оправяне грешка.

1
desislavaTsvetkova6 avatar desislavaTsvetkova6 3 Точки

Здравейте! 

За да не правя нова тема за задачата, направо ще попитам тук:
Някой може ли да ми каже защо имам 93/100 на judge системата? Последният тест 15 излиза, че е грешен. :/

Решение

Judge

Благодаря!

 

0
17/10/2014 17:56:33
Kamigawa avatar Kamigawa 750 Точки

За съжаление сега не мога да проверя, но можеш да видиш входните данни на юнит теста, който ти дава грешка и да видиш сама защо се случва така с дебъгера. Ето тук : https://softuni.bg/trainings/coursesinstances/details/2 най-долу ги има в рарчета всичките изпити и входящи /очаквани/ изходящи данни. Тестът, който правиш е първият - ето какво подава джъджа :

27
555

и очаква като отговор:

No

0
17/10/2014 18:39:15
crazy7 avatar crazy7 177 Точки

Защото при първо число 111 добавяш 555 и второто ти число става 666 и към него пак добавяш 555 и третото ти число става четери цифрено а именно 1221.

И след това като ги събираш в wholeNumber ти обърква числото и то отговаря на другите изисквания но разликата вече между тройките не е 555.

Можеш да направиш нещо такова:

int wholeNumber = 0;
if (secondThree < 1000 && thirdThree < 1000)
{
    wholeNumber = firstThree * 1000000 + secondThree * 1000 + thirdThree;
}

1
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

crazy7, правиш излишна проверка в if-a. По условие е казано, че diff винаги е положително число, следователно secondThree винаги ще е по-малко от thirdThree. Освен това числото може да съдържа само цифри от 1 до 7, следователно е достатъчно да се проверява  thirdThree < 778.

1
17/10/2014 20:10:54
VyaraG avatar VyaraG 45 Точки

Здравейте, колеги :))

Ето още едно решение

 NineDigitMagicNumber :)

 

1
Fujitzo avatar Fujitzo 9 Точки

@Вяра (а и всички останали) ,

Харесва ми решението ти - кратичко и същевременно богато на методи. Аз 3-4 часа се борех с тази задача, но тя ми е една от първите от изпити така или иначе. В началото и малките възвишения изглеждат непреодолими планини, така че ако има и други като мен, които се сдухват при наличието на толкова мн "гурута" - релакс , всяко нещо с времето си :)

Първо цях да похваля колежката Verito с това че ми даде идея как да конкатенирам integers. Мислех си че е някъв трик, заучена последователност, но после като видях твоя пример - още по-кратко и лесно може да е! :)

Към решението на Вяра са ми въпрсите:

  1.   if (wholeNumber.Contains("8")||wholeNumber.Contains("9")||wholeNumber.Contains("0"))

  2.             {

  3.                 continue;

  4.             }

Каква е идеята на това ? ако ще продължава цикъла какъв е смисъла да го пишем ? И не е ли идеята точно да махнем 0,8 и 9 по някакъв начин...

 

  1. for (int k = 0; k < wholeNumber.Length; k++)

  2.             {

  3.                 targetSum += Convert.ToInt32(Convert.ToString(wholeNumber[k]));

  4.             }

Каква е идеята да конверираме числата от редицата в string и после пак в int ако те са си int така или иначе ? 

 

Благодаря на отзовалите се, аз лично направих задачата с 9 вложени цикъла и ми изглежда доста ясен и подреден кода. Само дето гърми за време..

 

-1