الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حساب التباديل لمجموعة أعداد

بدأه ABCDEFG في 10 يوليو 2009 · 15 رد · 5,130 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

لدينا مجموعة أعداد و لتكن 1 2 3

إن مجموعة التباديل لهذه الأعداد هي ::

1 2 3

1 3 2

1 2 3

1 1 1

1 2 2

1 3 3

2 1 3

..........

....

و حتى النهاية

سؤالي هو : كيف يمكننا طباعة هذه التباديل ؟؟

بالنسبة لهذه الحالة فالكود بسيط و الفكرة هي تخزين الثلاثة أعداد في مصفوفة

و منم ثم عمل 3 حلقات فور و نكتب ضمن الحلقة الأخيرة :

cout << a << a[j] << a[k] << endl ;

و لكن الفكرة ستكون صعبة إذا كان لدينا عدد و لا نعرف عدد خاناته.

مثلا من أجل عدد مؤلف من 4 خانات يجب عمل 4 حلقات و هكذا

فهل توجد طريقة أسهل ؟؟ أو هل يمكننا التحكم بعدد الحلقات ؟؟؟

#2

من خلال هذا الموضوع ستعرف كيفية الحصول على عدد خانات الرقم من هنا

استخدم المصفوفات الديناميكية

تم تعديل هذه المشاركة بواسطة time1 في 10 يوليو 2009 في 12:19

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

السلام عليكم

هل تريد برنامج يقوم بكتابة جميع التبديلات الممكنه لعدد معين

البرنامج التالى يقوم بذلك ولكن بدون تكرار

البرنامج يتعامل مع مصفوفه من الأرقام يتم تحديد عددها مسبقا

ثم ادخال تلك الأعداد

#include<iostream>
using namespace std;
int arr1[10];
int arr2[10];
void print(int s)
{
	for(int i=0;i<s;i++)
		cout<<arr1[arr2];
	cout<<endl;
}
void start(int n,int s)
{
	for(int i=0;i<s;i++)
	{
		if(arr2==0)
		{
			arr2=n;
			if(n==s-1) print(s);
			else
			start(n+1,s);
			arr2=0;
		}
	}
}
int main()
{
	int n;
	cout<<"Enter the number of elements :"; cin>>n;
	for(int i=0;i<n;i++)
		cin>>arr1;
	for(int j=0;j<n;j++)
		arr2[j]=0;
	start(1,n);
	cin.get();
	cin.get();
	return 0;
}

البرنامج موجود فى هذا الرابط

اضـــــغط هنا

ولكن بلغتى الباسكال والفيجوال بيزك

وقمت بتحويله الى السى بلس بلس ببعض التعديلات ليتم الغاء التكرار ويتعامل مع اى عدد من القيم

سلام

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#4

مشكور أخي الكريم

بس أنا قصدي لو عرفت عدد خانات الرقم بدي حلقات فور على عدد الخانات

مثلا اذا 4 خانات بدي 4 حلقات فور ...

كيف يمكن حل هذه المشكلة

#5

ضع الكود الذي يقوم بتنفيذ البرنامج اذا كان عدد الخانات معروف وسنقوم بالتعديل عليه لما يناسب طلبك .

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#6

تفضل أخي هذا هو الكود ::

int main()

{

int a[3]={1,2,3};

for(int i=0;i<3;i++)

for(int j=0;j<3;j++)

for(int k=0;k<3;k++)

cout << a<< a[j]<<a[k]<< endl;

}

هنا عدد الخانات 3 لذلك قمت بعمل 3 حلقات فور

#7

من هنا : /index.php?showtopic=92227

الخوارزمية الأولى بالسي++

/index.php?showtopic=92224

الخوارزمية عامة ل N و K تختارهما وليس بالضرورة 3 خانات فقط .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#8

الله يعطيك العافية اخوي HGB

خوارزمية رائعة

وتم التعديل عليها لكي تحسب اي جملة يدخلها المستخدم

#include <iostream>
#include <math.h>
#include <string>

using namespace std;

void main()
{
	string word;


	int size,loop=0;
	unsigned int POW=0;
	cout<<"Enter the string \n";
	getline(cin,word);
	size=word.size();


	for(int q=0;q<pow(static_cast<float>(size),size);q++)

	{
		 for(int w=0;w<size;w++)
		 {
			 POW=pow(static_cast<float>(size),w);
			 cout<<word[((q-(q%POW))/POW)%size];
		 }
		cout<<endl;
		loop++;
	}

	cout<<"FINISH"<<endl<<loop;

	cin.ignore();
}

والشكر موصول لصاحب الموضوع

#9

جميل جدا , وإنتبه أيضا أن التبديلات يمكن أن تتم في عدد خانات أكبر من طول السلسلة بالتالي سيظهر التكرار والتكرارات بالطريقة الصحيحة لتعطي كل الإحتمالات الممكنة "بدون زيادة عدد مرات ظهور الحرف الواحد عن أقصى عدد مرات من السلسلة الأصلية "

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#10

هلا اخوي HGB

الان التباديل غير مسموح فيها التكرار Permutations

وهو تعريفها

مثلا اذا عندنا مجموعة فية سبع طلاب ما هو احتملات اختيار الطلاب او ترتيب الطلاب

يعني السبع طلاب اوزعهم في سبع خانات

في الخانة الاولى احتماليت اختيار طالب هي سبعة

وفي الخانة الثانية احتماليت اختيار طالب هي ستة لاني في الخانة الاولى اخترت طالب فيبقى عندي ستة

وكذالك الخامسة ....حتى نصل الى الاخيرة

فيصير احتماليت اختيار الطلاب هي مضروب السبعة !7

اما التوافيق Combination فلا يهم فيها الترتيب

فاانا اشوف موضوع اخوي ليس تباديل انما توافيق

هذي الفكرة الي عندي ما ادري هي صحيحة والا خاطئة (لكن متأكد انها صحيحة :))

#11

أنا أتحدث عن إمكانيات الخوارزمية وليس عن السؤال في الموضوع هنا :) قصدي أن الخوارزمية تمكنك من إختيار عدد الخانات التي تريد تغيير التباديل فيها أيضا .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#12

هلا اخوي معليش ما وضحت قصدي آسف

الي اقصدة ان الخوارزمية للتوافيق وليس التباديل لان التوافيق يسمح بها التكرارCombination

شوف الرابط هذا

http://en.wikipedia.org/wiki/Combination

اقتباس
عدد الخانات التي تريد تغيير التباديل فيها أيضا .

والله ما عرفت لها اخوي ....:)

#13

إعذرني كتبت الخوارزمية قبل 9 سنوات :S ووضعتها في الفريق مع عدة أمور أخرى قبل مدة لكي لاتضيع , لاحظ للكود في الرد التالي لتفهم الفكرة تماما .

الموضوع لاتباديل ولاتوافيق , خوارزمية التوافيق موجودة هنا : /index.php?showtopic=42758

هذه العملية كما طلب السائل فيها تكرار , يعني 3 أحرف في 3 خانات هي mimetex.cgi?3^3=27 إحتمال , ولو كانت 5 أحرف توزع في 3 خانات ستصبح mimetex.cgi?5^3=125 إحتمال , ولو كانت 3 أحرف توزع في 5 خانات ستصبح mimetex.cgi?3^5=234 إحتمال مختلف .

يمكن أن تستخدم ك Password cracker لو أردت لكن تحتاج لعمل tuning لبعض المتغيرات لتعطي أسرع النتائج .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#14

خذ الكود المعدل إستخدمه مع VS سيعمل مباشرة وإنتبه للتعليقات في الكود :) , غير القيمة PLACES بأي شيء تريده وراقب النتيجة :

 

[color= #007f00;]#include "stdafx.h"

[color= #007f00;]#include <cmath>

[color= #007f00;]#include <iostream>

 

[color= #0000ff;]using [color= #0000ff;]namespace std;

 

[color= #0000ff;]int _tmain[color= #000000;]([color= #0000ff;]int argc, _TCHAR[color= #000000;]* argv[color= #000000;][[color= #000000;]][color= #000000;])

[color= #000000;]{

	[color= #0000ff;]const [color= #0000ff;]int PLACES[color= #000000;]=[color= #ff0000;]5;	[color= #007f00;]//How many places do you want the characters to be placed in, "any number"

    [color= #0000ff;]int result[color= #000000;][PLACES[color= #000000;]];

 

    [color= #0000ff;]unsigned [color= #0000ff;]int POW;

    [color= #0000ff;]const [color= #0000ff;]int char_num[color= #000000;]=[color= #ff0000;]3;	[color= #007f00;]//Define the number of characters

    [color= #0000ff;]char STRING[color= #000000;][char_num[color= #000000;]][color= #000000;]=[color= #000000;]{[color= #A31515;]'1',[color= #A31515;]'2',[color= #A31515;]'3'[color= #000000;]};	[color= #007f00;]//Write down your characters array

 

	cout[color= #000000;]<<[color= #A31515;]"The total number of substrings is : "[color= #000000;]<<pow[color= #000000;]([color= #000000;]([color= #0000ff;]float[color= #000000;])char_num,PLACES[color= #000000;])[color= #000000;]<<endl;

	cout[color= #000000;]<<[color= #A31515;]"Press Enter to continue displaying the strings"[color= #000000;]<<endl;

	cin.[color= #808000;]get[color= #000000;]([color= #000000;]);

 

    [color= #0000ff;]for[color= #000000;]([color= #0000ff;]int q[color= #000000;]=[color= #ff0000;]0;q[color= #000000;]<pow[color= #000000;]([color= #000000;]([color= #0000ff;]float[color= #000000;])char_num,PLACES[color= #000000;]);q[color= #000000;]++[color= #000000;])

    [color= #000000;]{

	[color= #0000ff;]for[color= #000000;]([color= #0000ff;]int w[color= #000000;]=[color= #ff0000;]0;w[color= #000000;]<PLACES;w[color= #000000;]++[color= #000000;])

		[color= #000000;]{

			POW[color= #000000;]=pow[color= #000000;]([color= #000000;]([color= #0000ff;]float[color= #000000;])char_num,w[color= #000000;]);

			cout[color= #000000;]<<STRING[color= #000000;][[color= #000000;]([color= #000000;](q[color= #000000;]-[color= #000000;](q[color= #000000;]%POW[color= #000000;])[color= #000000;])[color= #000000;]/POW[color= #000000;])[color= #000000;]%char_num[color= #000000;]];

		[color= #000000;]}	

		cout[color= #000000;]<<endl;

    [color= #000000;]}

 

    cout[color= #000000;]<<[color= #A31515;]"FINISH"[color= #000000;]<<endl;

    cin.[color= #808000;]ignore[color= #000000;]([color= #000000;]);

	cin.[color= #808000;]get[color= #000000;]([color= #000000;]);	[color= #007f00;]//Freez the screen, you can also use ctrl+F5 in VS compilers

 

	[color= #0000ff;]return [color= #ff0000;]0;

[color= #000000;]}

للقص السريع :

// perm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <cmath>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	const int PLACES=5;	//How many places do you want the characters to be placed in, "any number"
	int result[PLACES];

	unsigned int POW;
	const int char_num=3;	//Define the number of characters
	char STRING[char_num]={'1','2','3'};	//Write down your characters array

	cout<<"The total number of substrings is : "<<pow((float)char_num,PLACES)<<endl;
	cout<<"Press Enter to continue displaying the strings"<<endl;
	cin.get();

	for(int q=0;q<pow((float)char_num,PLACES);q++)
	{
		for(int w=0;w<PLACES;w++)
			{
				POW=pow((float)char_num,w);
				cout<<STRING[((q-(q%POW))/POW)%char_num];
			}	
		cout<<endl;
	}

	cout<<"FINISH"<<endl;
	cin.ignore();
	cin.get();	//Freez the screen, you can also use ctrl+F5 in VS compilers

	return 0;
}

تم التعديل على الخوارزمية الرئيسية في الرابط الأول .

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#15

السلام عليكم

ما شاء الله عليك أخى HGB وانت يا أخى المستشار

بالنسبه لرأس السؤال فهو لا يطلق عليه تباديل فى الحقيقه

ولكنه يمكن ان يكون هو تكوين جميع الأعداد الممكنه ( من ثلاث خانات) التى يمكن تكوينها من ثلاثة اعداد 1 2 3 ومسموح فيها التكرار مأخوذه كليا او جزئيا

وهى عددها يساوى عدد عناصر السورس ^ عدد الخانات =3^3=27

أما التباديل فهى لا تسمح بتكرار أحد العناصر مرتين بمعنى ان 1 يظهر مره واحده و 2 مره واحده و 3 مره واحده فى كل تبديله

وعدد البدائل الممكنه = 3*2*1 =6

وهو ما تم فى البرنامج الذى ارفقته ( ولم يعلق عليه أحد )( لا ادرى لماذا ؟؟؟)

اما التوافيق فهى تعتبر ان 123 هى 231 هى 132 وهكذا

اى ان كل هذه التباديل تعبر عن توفيقه واحده

ويتم حسابها بقسمة التباديل الممكنه / مضروب عدد الخانات المراد تكوينها

فعلى حسب رأس السؤال تكون الخوارزميه

تحياتى

تم تعديل هذه المشاركة بواسطة amin_mu123 في 16 يوليو 2009 في 20:30

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#16

اخوي HGB

الله يعطيك العافية كفيت ووفيت

اقتباس
وهو ما تم فى البرنامج الذى ارفقته ( ولم يعلق عليه أحد )( لا ادرى لماذا ؟؟؟)

شفت برنامجك استاذ امين

وجاري مراجعة الموضوع ...الموضوع رياضي بحت يبيلة مخمخة :)

مواضيع مشابهة