PDA

View Full Version : سوال: تفکیک و ترکیب اعداد در یک بازه و بدست آوردن جوابهای منطقی توسط سی شارپ



jafarpalideh
جمعه 06 آذر 1394, 07:34 صبح
با سلام .
یه چالشی واسم بوجود اومده که میخوام اینجا مطرحش کنم .
توابع زیر رو در نظر میگیریم (البته میتونه شامل هزاران عدد مختلف باشه):

X = a*b
Y = c*e
Z = F*g
W = h*i

10 تا عدد هم داریم مثل : 2000 و 2050 و 2100 و 1800 و 1850 و 1600 و 2200 و 1500 و 1700 و 1900

حالا میخوایم که حالت های زیر رو داشته باشیم . جواهایی قابل قبوله که حاصل بتونه بین هر یک از بازه های بالا باضافه +-20 تلرانس داشته باشه . و عدد 5 ثابته و تا عدد 1 میاد پایین تویه ضرب ها

M = (5*a) => 2000-20< M <2000+20 OR M = (5*a) => 2050-20< M <2050+20 OR

M= (4*a) => 2000-20< M <2000+20 OR M = (4*a) => 2050-20< M <2050+20 OR

M= (3*a) => 2000-20< M <2000+20 OR M = (3*a) => 2050-20< M <2050+20 OR

M= (2*a) => 2000-20< M <2000+20 OR M = (2*a) => 2050-20< M <2050+20 OR

M= (1*a) => 2000-20< M <2000+20 OR M = (1*a) => 2050-20< M <2050+20 OR


حالا میتونیم حالتها رو ترکیب کنیم بطوریکه تکرار نداشته باشیم .



N= (4*a) +(c*1)=> 2000-20< N <2000+20 OR N= (4*a) +(c*1)=> 2050-20< N <2050+20 OR

N= (3*a) +(c*2)=> 2000-20< N <2000+20 OR N= (3*a) +(c*2)=> 2050-20< N <2050+20 OR

N= (2*a) +(c*3)=> 2000-20< N <2000+20 OR N= (2*a) +(c*3)=> 2050-20< N <2050+20 OR

N= (1*a) +(c*4)=> 2000-20< N <2000+20 OR N= (1*a) +(c*4)=> 2050-20< N <2050+20 OR


و همچنین این قضیه ادامه داره تا ترکیبهای مختلف بدست بیاد و اینکه هر لحظه ممکنه که تر ترکیب جدید به اون x و y ها اضافه بشه .
اگه جایی از سوال گنگه بگید تا توضیح بیشتری بدم .

jafarpalideh
جمعه 06 آذر 1394, 13:48 عصر
خوب سوالم رو طور دیگه ای مطرح میکنم .
یک لیست داریم که شامل 1000 یا تعداد بیشتری عدد بین 100 تا 1000 یا هر بازه ی دیگه ایه .
10 تا عدد هم داریم که جمع دوتایی از اعداد بالا با ضرب شدن در یکی از اعداد 5 یا 4 یا 3 یا 2 یا 1 نمیتونه از بازه ی اون 10 عدد شاخص(1800 – 1880 – 2000- 2200 – 2100 و و و) بیشتر بشه(البته اعداد تا 20-+ تلرانس داره یعنی اگه عدد به دست اومده تویه بازه ی +-20 تا کمتر یا بیشتر از اعداد شاخص هم باشه قابل قبوله .).
حالا من یه لیست از اون حالت های مختلف مجاز رو میخوام داشته باشم .
مثال : اعداد لیست اینا هستن : 100 و 850
850*5 = 4250 false
850*4 = 3400 false
850*3 = 2550 false
850*2 + 1 *100 = 1800 true
.
.
.

jafarpalideh
شنبه 07 آذر 1394, 12:48 عصر
یا سوالم گنگه یا خیلی سخته .
خوب ساده تر میگم .
5 تا عدد داریم . (100 و 200 و 300 و400 و 500)
حالا میخوایم که این اعداد در 5 یا 4 یا 3 یا 2 یا 1 ضرب بشه و فقط دوتا دوتا با هم جمع کنیم و با 4 تا عدد (1200 و 1400 و 1600 و 1800) مقایسه کنیم که آیا مساوی این اعداد هست یا نه .
مثال :
4*100+200*1 = 900 پس نیست
3*100+200*2 = 800 پس نیست
.
.
.
4*100+300*1 = 1300 پس هست

jafarpalideh
شنبه 07 آذر 1394, 14:09 عصر
بازم توضیح میدم .
فکرکنیم یه عدد داریم مثلا 100
حالا میخوایم این عدد رو ضربدر 5 یا 4 یا 3 یا 2 یا 1 بکنیم

و با 5 تا عدد دیگه مثلا
(200 و 300 و 350 و 450 و 500)
مقایسه کنیم و ببینیم که برابر این اعداد هست یا نه . اگه بود که تویه یه لیست به ما نشون بده و اگه نبود که هیچی .



حالا میخوام که واسه ی دو تا عدد انجام بدم .

یعنی مثلا 100 و 200

وقتی 100 در 4 ضرب شد باضافه ی ضرب 200 در 1 بشه و بعد مقایسه بشه .
وقتی 100 در 3 ضرب شد باضافه ی ضرب 200 در 2 بشه و بعد مقایسه بشه و همینطور تا آخر



و در حالت کلی ممکنه اعداد مختلفی وجود داشته باشه که باید این سیکل در اون تکرار بشه .
یعنی علاوه بر 100 و 200 میتونه 500 ت عدد دیگه هم باشه .

reza_ali202000
شنبه 07 آذر 1394, 14:25 عصر
سلام
سوالتون خیلی گنگ هست.
اصلا متوجه نشدم منظورتون چیه؟
حالا عددی رو که به دست آوردیم ببینیم توی اون ده تا عدد به صورت بازه ای قرار میگیره یا فقط با یکی از اون اعداد مقایسه بشه؟ مثلا اگه 1*100+4*100 میشه همیشه با مثلا 500 مقایسه بشه یا با تمام اعداد.
یه خورده الگوریتم وار توضیح بدین که اگه بتونم کمکتون کنم.

jafarpalideh
شنبه 07 آذر 1394, 14:36 عصر
ممنون که لااقل یه نگاهی انداختین . امیدوار شدم .
اون 10 یا 5 تا عددی که گفتم کاملا ثابته

فقط مثلا 500 تا عدد دیگه در 5 یا 4 یا 3 یا 2 یا 1 ضرب میشه و با هم جمع میشه و با اون 5 یا 10 تا عدد مقایسه میشه .
اگه تویه بازه بود میاره تویه لیست .

ژیار رحیمی
شنبه 07 آذر 1394, 14:55 عصر
سلام چند تابع ابتدایی پست اولتون در کجای الگوریتم کاربر داره بهش اشاره نکردی؟الگوریتم شما رو متوجه شدم الان در نحوه نوشتن کد الگوریتم مشکل داری؟ اگر خود شما کد نوشتی لطفا بزارید تا بررسی شود

jafarpalideh
شنبه 07 آذر 1394, 14:57 عصر
البته اینجا کامل توضیح دادم .

بازم توضیح میدم .
فکرکنیم یه عدد داریم مثلا 100
حالا میخوایم این عدد رو ضربدر 5 یا 4 یا 3 یا 2 یا 1 بکنیم

و با 5 تا عدد دیگه مثلا
(200 و 300 و 350 و 450 و 500)
مقایسه کنیم و ببینیم که برابر این اعداد هست یا نه . اگه بود که تویه یه لیست به ما نشون بده و اگه نبود که هیچی .



حالا میخوام که واسه ی دو تا عدد انجام بدم .

یعنی مثلا 100 و 200

وقتی 100 در 4 ضرب شد باضافه ی ضرب 200 در 1 بشه و بعد مقایسه بشه .
وقتی 100 در 3 ضرب شد باضافه ی ضرب 200 در 2 بشه و بعد مقایسه بشه و همینطور تا آخر



و در حالت کلی ممکنه اعداد مختلفی وجود داشته باشه که باید این سیکل در اون تکرار بشه .
یعنی علاوه بر 100 و 200 میتونه 500 ت عدد دیگه هم باشه .

jafarpalideh
شنبه 07 آذر 1394, 14:59 عصر
متاسفانه من کدی ننوشتم آقای رحیمی. لااقل میخوام دوستان یه کد بنویسن تا من رویه اون مانور بدم .
نه اینکه ننوشته باشم .
نوشتم ولی همون اول کار رو نفهمیدم که چیکار کنم .


using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int x = 400;
int y = 500;
int z = 600;




int a = 2100;
int b = 2200;
int c = 1900;
int d = 2000;




private void Form1_Load(object sender, EventArgs e)
{


}


private void button1_Click(object sender, EventArgs e)
{
for (int i = 1; i <= 5; i++)
{
for (int j = 1 ; j <= 5; j++)
{
if (x * j == a || x * j == b || (x * j + y * (j - 1)) == a || x * j == c || x * j == d)
{
listBox1.Items.Add(x * j );
}
//else if (true)
//{

//}
}
}
}
}
}

ژیار رحیمی
شنبه 07 آذر 1394, 16:02 عصر
توضیحات این قسمت مبهمه دوست من.شما مگفتین

یه عدد داریم مثلا 100

حالا میخوایم این عدد رو ضربدر 5 یا 4 یا 3 یا 2 یا 1 بکنیم


و با 5 تا عدد دیگه مثلا

(200 و 300 و 350 و 450 و 500)

در صورتیکه در قسمت مقایسه

وقتی 100 در 4 ضرب شد باضافه ی ضرب 200 در
1
بشه و بعد مقایسه بشه

عدد شاخص که 200 هست در عدد 1 که یکی از اعداد(در بازه 1و2و3و4و5) هست.

jafarpalideh
شنبه 07 آذر 1394, 16:15 عصر
اونقدر که نوشتم اشتباه شده متاسفانه .

اون اعداد شاخص اعدادیه که تویه پست اول گفتم یعنی
2000 و 2050 و 2100 و 1800 و 1850 و 1600 و 2200 و 1500 و 1700 و 1900 اعداد .

اون 100 رو هم مثال زدم . البته میتونه هر عدد دیگه ای باشه . زیر 1500 که یعنی پایینترین عدد بازه ی بالا .

jafarpalideh
شنبه 07 آذر 1394, 16:18 عصر
توضیحات این قسمت مبهمه دوست من.شما مگفتین

یه عدد داریم مثلا 100


حالا میخوایم این عدد رو ضربدر 5 یا 4 یا 3 یا 2 یا 1 بکنیم



و با 5 تا عدد دیگه مثلا


(200 و 300 و 350 و 450 و 500)

در صورتیکه در قسمت مقایسه


وقتی 100 در 4 ضرب شد باضافه ی ضرب 200 در

1

بشه و بعد مقایسه بشه


عدد شاخص که 200 هست در عدد 1 که یکی از اعداد(در بازه 1و2و3و4و5) هست.


اون پست من شامل دوتا سواله . اول فقط عدد 100 رو نوشتم و بعد یکم پیچیدش کردم و عدد 200 رو هم بهش اضافه کردم .

jafarpalideh
یک شنبه 08 آذر 1394, 11:44 صبح
با سلام.
دیگه میخوام خیلی سادش کنم سوالم رو .
دو عدد 100 و 110 داریم .
میخوایم این اعدد روبه ترتیب در 5 و 4 و 3 و2 و1 ضرب کنیم بعد با هم جمع کنیم . اگه برابر با 520 بود اون مضرب ها رو به ما نشون بده .

مثال :
100*5 = 500 = غیرقابل قبول
100*4 + 110*1 = 510 = غیرقابل قبول
100*3 + 110*2 = 520 = قابل قبول
100*2 + 110* 3 = 530 = غیرقابل قبول
100*1 + 110*4 = 540 = غیرقابل قبول

محمد رضا فاتحی
یک شنبه 08 آذر 1394, 12:14 عصر
طبق صورت مساله اخیر بنظر میاد این کد کمکت کنه

for (int i = 1; i < 6; i++)
{
for (int j = 1; j < 6; j++)
{
if (i * 100 + j * 110 == 520)
{
listBox1.Items.Add(i + "," + j);
}
}
}


مثلا الان 2 و 3 رو میاره تو لیست

jafarpalideh
یک شنبه 08 آذر 1394, 12:50 عصر
من میخوام که
100*3 + 110*2 رو واسم بیاره . واینکه اگه به جای اون 100 و 110 بخوایم 200 تا عدد دیگه رو به همین طریق با هم ترکیب کنیم باید چیکار کنیم که ترکیب رو هم به ما نشون بده ؟

Mahmoud.Afrad
یک شنبه 08 آذر 1394, 13:26 عصر
اگر به جای 110 بزاریم x و به جای 100 بزاریم y نتیجه یک معادله دومجهولی هست و با یک معادله نمیشه حلش کرد و برای اینکه بتونی جواب بدست بیاری باید اعداد رو دونه دونه جایگذاری کنی ببینی توی معادله جواب میده یا نه.
برای شروع: ترکیب اعداد با مضارب رو در یک لیست بدست بیار(یک کلاس شبیه کلاس زیر نیاز داری).

public class ZarbClass
{
public int Mazroob { get; set; }
public int Mazrab { get; set; }

public int HaselZarb
{
get { return Mazroob*Mazrab; }
}
}

بعد جمع رو بدست بیار و چک کن در بازه مورد نظر هست یا نه.

jafarpalideh
یک شنبه 08 آذر 1394, 14:08 عصر
این فقط جواب رو برمیگردونه . ترکیب رو چطور داشته باشم ؟

aslan
یک شنبه 08 آذر 1394, 15:15 عصر
سلام
ببینید منظورتون همچین چیزیه ؟

jafarpalideh
یک شنبه 08 آذر 1394, 15:38 عصر
دقیقا همینه

aslan
یک شنبه 08 آذر 1394, 15:50 عصر
دقیقا همینه

فکر کنم اگر تصویر را بدقت تجزیه و تحلیل کنید براحتی میتونید کدهاشو بنویسید
موفق باشید

محمد رضا فاتحی
دوشنبه 09 آذر 1394, 08:01 صبح
دوست عزیزم....طبق تصویر ارسالی دوستمون aslan یه نمونه برات درست کردم امیدوارم به کارت بیاد...شاید بشه بهینه ترش کرد ولی هول هولی این شد!
*********
کد اصلی برنامه رو اینطوری تغییر بده

int X=0;int Y = 0;
int trans = int.Parse(textBox1.Text);
int hadaf = 0;
int num2 = 0, num3 = 0;
for (int i = 0; i < listBox2.Items.Count; i++)
{
int num1 = int.Parse(listBox2.GetItemText(listBox2.Items[i]));
for (int j = 0; j < listBox1.Items.Count; j++)
{
num2 = int.Parse(listBox1.GetItemText(listBox1.Items[j]));//100
for (int k = j + 1; k < listBox1.Items.Count; k++)
{
num3 = int.Parse(listBox1.GetItemText(listBox1.Items[k]));//110
for (int x = 0; x <= 5; x++)
{
X = x;
for (int y = 5; y >= 0; y--)
{
hadaf = num2*x + num3*y;
Y = y;
if (hadaf + trans == num1 || hadaf - trans == num1 || hadaf == num1)
{
listBox3.Items.Add(num1 + "+=" + trans + "===>(" + num2 + "*" + X + ")+(" + num3 + "*" + Y +
")=" + hadaf + " IS OK");
}
else
{
listBox3.Items.Add(num1 + "+=" + trans + "===>(" + num2 + "*" + X + ")+(" + num3 + "*" + Y +
")=" + hadaf + " IS NOTOK");
}
}

}


}
}

}