PDA

View Full Version : پاسخ الگوریتم مهم



BANKER
شنبه 03 شهریور 1397, 10:31 صبح
سلام بر همه دوستان
این الگوریتمی پاسخ مهمی دارد هرکسی که توان انجام آن را دارد پاسخ را اعلام کند...

الگوریتمی بنویسید که آرایه ای به طول n را از ورودی بگیرد و آرایه ای به طول n تولید کند به نحوی که هر خانه خروجی برابر حاصلظرب تمامی خانه های ورودی به غیر از خانه متناظر باشد

Vahid.nj
دوشنبه 05 شهریور 1397, 02:13 صبح
سلام، من زیاد به این پاسخ مطمئن نیستم ولی فکر می کنم منظور شما یه همچین چیزی باشه:

public static int[] MyAlgorythem (int[] array)
{
int[] Result = new int[array.length];

for (int i=0; i < array.length; i++)
{
int num = array[i];
int? mlt;
foreach (int number in array)
{
if (number != num) mlt = (mlt == null)? number: mlt * number;
}
Result[i] = (mlt == null)? 0: mlt;
}
return Result;
}

BANKER
دوشنبه 05 شهریور 1397, 10:35 صبح
بسیار ممنون از پاسخ گویی شما
میشه لزفا یه توضیحاتی هم در باره الگوریتمی که نوشتید و روند اون بگید.
و دوم اینکه
int? mlt مفهوم این چیه چرا علامت سوال گذاشتید

public static int[] MyAlgorythem (int[] array)
{
int[] Result = new int[array.length];

for (int i=0; i < array.length; i++)
{
int num = array[i];
int? mlt;
foreach (int number in array)
{
if (number != num) mlt = (mlt == null)? number: mlt * number;
}
Result[i] = (mlt == null)? 0: mlt;
}
return Result;
}

farhad_shiri_ex
دوشنبه 05 شهریور 1397, 13:35 عصر
بسیار ممنون از پاسخ گویی شما
میشه لزفا یه توضیحاتی هم در باره الگوریتمی که نوشتید و روند اون بگید.
و دوم اینکه
int? mlt مفهوم این چیه چرا علامت سوال گذاشتید

public static int[] MyAlgorythem (int[] array)
{
int[] Result = new int[array.length];

for (int i=0; i < array.length; i++)
{
int num = array[i];
int? mlt;
foreach (int number in array)
{
if (number != num) mlt = (mlt == null)? number: mlt * number;
}
Result[i] = (mlt == null)? 0: mlt;
}
return Result;
}

وقتی متغیری را به این صورت ?int تعریف میکنید به صورت ضمنی دارید از یک کلاس ژنریک Nullable به نوع داده تون اضافه میکنید! که امکانات زیادی را به primitive data که تعریف کردید میده یکیش اینه که میتونید با اشاره گر null متغیر تون را چک کنید...
الگوریتمی هم که دوستمون نوشتن کاملا واضح هست
در حلقه اول مقدار اولین عضو آرایه ورودی را در یک متغیر موقت ذخیره میکنه!
در حلقه بعدی حاصلضرب تمام عضوهای آرایه به غیر از مقداری که در متغیر موقت ذخیره کرده اند را در یک متغیر به نام mlt ذخیره میکنه!
بعد از حلقه دوم هم در اندیس برابر حلقه اول مقدار حاصلضرب را می نویسه!
که البته به نظر میاد با اون چیزی که شما نوشتید روی کاغذ و ضمیمه کردید کاملا منتفاوت هست!

Vahid.nj
دوشنبه 05 شهریور 1397, 13:37 عصر
کد بالا یکم ایراد داشت ولی خب تقریبا درسته، من اون کد رو بدون استفاده از کامپایلر نوشته بودم.
این کد درسته:
public static int[] MyAlgorythem(int[] array) {
int[] Result = new int[array.Length];


for (int i = 0; i < array.Length; i++)
{
int num = array[i];
int? mlt = null;
foreach (int number in array)
{
if (number != num) mlt = (!mlt.HasValue) ? number : mlt * number;
}
Result[i] = (mlt.HasValue)? mlt.Value: 0;
}
return Result;
}

توضیحات:
اول از همه یک متد استاتیک تعریف کردیم که آرایه ای از جنس int میگیره و آرایه ای از جنس int برمیگردونه.
خط بعدی یک آرایه تعریف کردیم که اندازش با اندازه ی آرایه ورودی تعیین میشه.
بعد یه حلقه for برای پیمایش آرایه ورودی
int? mlt یه مقدار نال پذیر برای محاسبه جواب حلقه
دوباره حلقه foreach برای پیمایش آرایه ورودی که داخل این حلقه یک شرط قرار دادیم که اگر عدد برابر عدد مورد نظر ما نبود عمل ضرب رو انجام بده
در آخر هم آرایه ای که به عنوان جواب تعریف کردیم و پرش کردیم برای خروجی متد برمی گردونیم.
پروژه VS2017 هم ضمیمه می کنم.
این تست ها:

int[] Test1 = Class1.MyAlgorythem(new int[] { 3, 7, 2, 3, 4, 2 }); //Test1 = {112, 144, 252, 112, 252, 252}
int[] Test2 = Class1.MyAlgorythem(new int[] { 1, 1, 1, 1 }); //Test2 = {0, 0, 0, 0}
int[] Test3 = Class1.MyAlgorythem(new int[] { 1 }); //Test3 = {0}
int[] Test4 = Class1.MyAlgorythem(new int[] { }); //Test4 = int[0]
int[] Test5 = Class1.MyAlgorythem(new int[] { 3, 7 }); //Test5 = {7, 3}

BANKER
سه شنبه 06 شهریور 1397, 13:38 عصر
سپاسگزارم از همه شما دوستان
فقط اینکه صورت مسئله ای که داده شده منظور این بوده که محتوای هر خانه ای ضرب در محتوای خانه دوم شد جوابش رو در آرایه ای با شماره خونه غیر متناظر از از شماره خونه های ضرب شده قرر بدیم
مثلا خونه 0 ضرب در خانه 1 جوابش ریخته بشه در خونه 2 از آرایه خروجی
مثلا خونه 1 ضرب در خانه 2 جوابش ریخته بشه در خونه 0 از آرایه خروجی
مثلا خونه 2 ضرب در خانه 0 جوابش ریخته بشه در خونه 1 از آرایه خروجی

Vahid.nj
پنج شنبه 08 شهریور 1397, 14:27 عصر
من عذرخواهی می کنم که سوال رو خوب نخوندم و متوجه نشدم، کدی که شما میگید به این شکل هست:

public static int[] MyAlgorythem(int[] array)
{
if (array.Length == 1) return array;
int[] Result = new int[array.Length];
for (int i = 0; i < array.Length; i++)
{
int mlt = 1;
for (int j = 0; j < array.Length; j++)
{
if (i != j) mlt *= array[j];
}
Result[i] = mlt;
}
return Result;
}


تست ها:

int[] Test1 = Class1.MyAlgorythem(new int[] { 3, 7, 2, 3, 4, 2 }); //Test1 = {336, 144, 504, 336, 252, 504}
int[] Test2 = Class1.MyAlgorythem(new int[] { 1, 1, 1, 1 }); //Test2 = {1, 1, 1, 1}
int[] Test3 = Class1.MyAlgorythem(new int[] { 5 }); //Test3 = {5}
int[] Test4 = Class1.MyAlgorythem(new int[] { }); //Test4 = int[0]
int[] Test5 = Class1.MyAlgorythem(new int[] { 3, 7 }); //Test5 = {7, 3}

BANKER
پنج شنبه 08 شهریور 1397, 22:32 عصر
عید بر شما و همه دوستان عزیزم در این گروه مبارک باشه
خیلی ممنون از لطف و توجه شما
و
اینکه اینقدر محبت و توجه نشون دادید

BANKER
پنج شنبه 08 شهریور 1397, 22:41 عصر
ص.رت مسئله این رو میگه که اعضای یک آرایه که شامل سه خانه مثلا اگر باشند باید باهم جوری ضرب شوند که

خانه 0 ام آرایه ورودی ضرب در خانه 1 ام آرایه ورودی شود و نتیجه در خانه دوم آرایه خروجی که غیر متناظر است (یعنی نه در خانه 2ام از آرایه خروجی و نه در خانه یکم از آرایه خروجی) قرار گیرد

همچنین

خانه 2 ام آرایه ورودی ضرب در خانه 0 ام آرایه ورودی شود و نتیجه در خانه یکم آرایه خروجی که غیر متناظر است(یعنی نه در خانه 1ام از آرایه خروجی و نه در خانه 0 از آرایه خروجی) قرار گیرد.

همچنین

خانه 1 ام آرایه ورودی ضرب در خانه 2 ام آرایه ورودی شود و نتیجه در خانه صفرم آرایه خروجی که غیر متناظر است(یعنی نه در خانه 1ام از آرایه خروجی و نه در خانه 2 از آرایه خروجی) قرار گیرد.

پیچیدگی زمانی رو هم بی زحمت بفرمایید ممنون

BANKER
یک شنبه 11 شهریور 1397, 09:59 صبح
با سلام دوستان جواب مسیله مطرح شده گویا درست نیست!
با توجه به توضیحات پیام ارسالی قبلی لطفا نسبت به حل مسئله اقدام فرمایید.
باتشکر