PDA

View Full Version : حرفه ای: الگوریتم برگشت عددهای حاصل از ضرب



loo30fer
سه شنبه 19 بهمن 1389, 10:50 صبح
با سلام خدمت دوستان
من دنبال الگوریتمی میگردم که 3 عدد حاصل از جمع رو بدست بیارم
بری مثال من 3 عدد داشتم که اولی 4 و دومی 22 و سومی 151 حالا حاصل جمع اینها شده 177
و حالا من تنها چیزی که دارم عدد 177 هست میخواستم بدونم چطور و با چه الگوریتم یا تابع دلفی میتونم 3 عدد حاصل از این رو بدست بیارم من یک نمونه رو همینجوری درست کردم میخوام مثلا به این شکل انجام بشه
نمونه تبدیل اعداد :


4 * 2 = 8
22 * 2 = 44
151 * 2 = 302
8 + 44 + 302 = 354
نمونه برگشت حاصل جمع اعداد :


354 / 40 / 2 = 4
354 / 8 / 2 = 22
354 / 1.172 / 2 = 151
حتما میگین مثلا این 40 از کجا اومد که من بر اون و دو تقسیمش کردم و جواب 4 که حاصل اولی بدست اومد:
من اومدم اعدادی رو که در تبدیل اعداد بر عدد اصلی ضرب شدن رو باهم ضرب و برای خودم یک مبنا تعیین کردم که عدد 5
مثلا 2 * 2 = 4 * 2 = 8 * 5 = 40 و در آخر باز تقسیم بر 2

ضمنا روش تبدیلش اشکال نداره ضرب تقسیم جمع یا تفریق باشه فقط میخوام جواب اعداد حاصل اصلی بدست بیاد
ممنون میشم دوستان و اساتید اگه کمکم بکنید آخه خیلی روش فکر کردم ولی به نتیجه ای نرسیدم :افسرده:

Salar Ashgi
سه شنبه 19 بهمن 1389, 14:16 عصر
سلام ؛ ببینید جهت حل این مساله باید یک پیش زمینه ای از ریاضیات گسسته و از بحث ترکیبیات داشته باشید ،
که من بطور مختصر بهتون توضیح میدم :

معادله X1+X2+X3=N یک معادله سیاله نامیده میشود ، Xi ها جوابهای طبیعی این معادله اند .
خوب حالا مساله اینجاست که چطور میشه واسه یک N (بزرگتر یا مساوی 3) ، Xi ها را یافت ؟! (دقت کنید که
Xi های بیشتر مساوی 1 و کمتر مساوی N-2 خواهند بود .)
خوب ، ببینید ، روال کار ساده است ؛ ما باید از Range مورد نظر شروع کرده و واسه یک X1 و واسه یک X2 ، تمام حالات از X3
که جمع شون برابر با N میشه رو پیدا کنیم ، به همین دلیل این مساله خیلی ساده با 3 تا حلقه تو در تو (Nested Loops) قابل حل خواهد بود .
من کد ++C اش رو هم نوشتم تا مساله بیشتر روشن بشه :



#include <iostream>
#include <conio>
int main(){
int n,f=1;
cout<<"Enter result :\n";
cin>>n;
cout<<"-----------------\n";
for(int i=1;i<=n-2;i++){
for(int j=1;j<=n-2;j++){
for(int k=1;k<=n-2;k++){
if(i+j+k==n){

cout<<f<<"."<<" "<<i<<" "<<j<<" "<<k<<endl;
f++;}
}
}
}
getch();
}

خروجی برای ورودی برابر 6 :
همانطور که می بینید 10 حالت برای جوابها وجود دارد .
که البته میشه اثبات کرد که تعداد جوابها برای عدد مفروض N
برابر است با :
66092

خروجی مورد نظر :

66091

موفق باشید ./

loo30fer
سه شنبه 19 بهمن 1389, 16:19 عصر
ممنون از توضیحاتتون و راستش منم ریاضیاتم خوب نیست و اگه امکان داره کد دلفیش رو قرار بدین چون من با ++C کار نکردم و چیزی ازش نمیفهمم با تشکر

FastCode
سه شنبه 19 بهمن 1389, 16:46 عصر
مساله رو کامل نگرفتم.

شاید این درست باشه:متفکر:

int input = *****;
int i;
int[] list = /*a big list, i think it is sizeof(int) * root(3, input) */
int list_pointer=0;
for(int n = 1;n != root(3, input);n++)
{
i = 3;
int copy = input;
int Sqr_n = sqrt(n);
for(int m = 1;m != Sqr_n;m++)
{
for(int p = 1;p != Sqr_n;p++)
{
if(i == 1)
{
if(copy != 0)
{
list[list_pointer++] = copy;
list[list_pointer++] = 1;
}
else
{
list_pointer -= i << 1;
}
}
else
{
int A = m * p;
if(A < copy)
{
copy -= A;
list[list_pointer++] = m;
list[list_pointer++] = p;
if(--i == 0) break;
}
}
}
}
}
اگر اون حالتی باشه که فکر نمیکنم باشه, تقریباً ۲۰۰ خط میشه.دعا کن نباشه.

loo30fer
سه شنبه 19 بهمن 1389, 17:06 عصر
مساله رو کامل نگرفتم.
من الگوریتمی رو میخوام که مثلا عدد 2 و 12 و 43 رو که دارم رو بتونم به یک عدد تبدیل کنم و قابلیت برگشت پذیری داشته باشه یکم واضح تر میگم مثلا همین عدد هام رو بر اساس الگوریتمی جمع میزنم که مثلا میشه 93 حالا من موندم و این عدد 93 حالا میخوام بتونم این عدد رو برگشت بدم به همون عدد های 2 و 12 و 43
فکر کنم کد شما هم برای ++C باشه اگه امکان داره کد دلفیش رو قرار بدین و اگه شما الگوریتمی براش دارین و پولی من مشکلی ندارم خریدارم

FastCode
سه شنبه 19 بهمن 1389, 18:16 عصر
من الگوریتمی رو میخوام که مثلا عدد 2 و 12 و 43 رو که دارم رو بتونم به یک عدد تبدیل کنم و قابلیت برگشت پذیری داشته باشه یکم واضح تر میگم مثلا همین عدد هام رو بر اساس الگوریتمی جمع میزنم که مثلا میشه 93 حالا من موندم و این عدد 93 حالا میخوام بتونم این عدد رو برگشت بدم به همون عدد های 2 و 12 و 43
فکر کنم کد شما هم برای ++C باشه اگه امکان داره کد دلفیش رو قرار بدین و اگه شما الگوریتمی براش دارین و پولی من مشکلی ندارم خریدارم
من دلفی بلد نیستم.:بامزه:
این کاری که شما میخواهید بکنید فکر میکنم همون کاریه که openssl میکنه.

Salar Ashgi
سه شنبه 19 بهمن 1389, 18:21 عصر
دوست عزیز ، روش کار رو که من گفتم ، حالا زبان که مهم نیست !
در ضمن کدی که من ذکر کردم ، نرمال ترین روش پیاده سازی این مساله هست .

موفق باشید ./

loo30fer
سه شنبه 19 بهمن 1389, 19:23 عصر
بازم شرمنده دوست عزیز آخه من خیلی وقته با ریاضی سروکار نداشتم برای همین خوب متوجه نحوه کار نمیشم , بعضی وقتها از هوش خودم لذت میبرم و بعضی وقتها مثل الان از هوشم ... :ناراحت:
پس اگه امکان داره یک نمونه کمپایل شدش رو قرار بدین که من 3 تا عدد رو بدم و یک عدد رو بگیرم و وقتی عددم رو میدم اون 3 تا عدد رو بگیرم ببخشید که اینقدر پرویی میکنم بخدا اگه کاری از دستم بر میومد و بر بیاد انجام میدم تا لطفتون رو جبران کنم

FastCode
سه شنبه 19 بهمن 1389, 21:14 عصر
بازم شرمنده دوست عزیز آخه من خیلی وقته با ریاضی سروکار نداشتم برای همین خوب متوجه نحوه کار نمیشم , بعضی وقتها از هوش خودم لذت میبرم و بعضی وقتها مثل الان از هوشم ... :ناراحت:
پس اگه امکان داره یک نمونه کمپایل شدش رو قرار بدین که من 3 تا عدد رو بدم و یک عدد رو بگیرم و وقتی عددم رو میدم اون 3 تا عدد رو بگیرم ببخشید که اینقدر پرویی میکنم بخدا اگه کاری از دستم بر میومد و بر بیاد انجام میدم تا لطفتون رو جبران کنم

شرمنده.
این کار غیر ممکنه.
http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/Cryptographic_hash_function

Salar Ashgi
سه شنبه 19 بهمن 1389, 23:35 عصر
من خیلی وقته با ریاضی سروکار نداشتم برای همین خوب متوجه نحوه کار نمیشم

دوست عزیز ، اول از همه بگم که همیشه باید سعی کنید در راستای قوانین سایت حرکت کنید !
ثانیا ، توضیحی که من ذکر کردم آنچنان نیاز به دانش پیشرفته ریاضی ندارد ، بقولی انتگرال که نمیخوایم حل کنیم !!!
ثالثا ، اینطور که برمیاد شما قدرت درک الگوریتمی تان مناسب نیست ، چراکه یک برنامه نویس نرمال ، باید بتونه یک الگوریتم رو
در زبان مربوطه اش به کد تبدیل کنه !
رابعا ، درخواست کد/پروژه طبق قوانین سایت اکیدا" ممنوع است ، پس لطفا" درخواست کد نکنید !
خامسا ، هیچ وقت به چیزهای آماده عادت نکنید ؛ آدم اگه رو یه مساله یه هفته هم وقت بذاره خیلی باارزش تره تا اینکه بیاد کدش رو
به هرطریقی در عرض چند دقیقه پیدا کنه !!!

امیدوارم به نکات ذکر شده ، توجه کافی نموده باشید .

موفق باشید ./

loo30fer
چهارشنبه 20 بهمن 1389, 17:14 عصر
دوست عزیز ، اول از همه بگم که همیشه باید سعی کنید در راستای قوانین سایت حرکت کنید !
جناب Salar Ashgi من که نه قصد نقض قوانین این سایت رو دارم و نه داشتم

درخواست کد/پروژه طبق قوانین سایت اکیدا" ممنوع است ، پس لطفا" درخواست کد نکنید !
ببخشید این رو میگم ولی من قوانین رو که خوندم همچین چیزی رو نیافتم پس قسمت کد و آپلود برای زیباییه ؟

هیچ وقت به چیزهای آماده عادت نکنید ؛ آدم اگه رو یه مساله یه هفته هم وقت بذاره خیلی باارزش تره تا اینکه بیاد کدش رو
به هرطریقی در عرض چند دقیقه پیدا کنه !!!
بله با حرف شما کاملا موافقم به خاطر عجلم به خودم اجازه ندادم به خودم زحمت بدم و یکم وقت بذارم
فقط اگه بگین اینی رو که من میخواستم که 3 عدد رو تبدیل کنم به یک عدد و دوباره بتونم اون عدد رو تبدیل کنم به همون 3 عدد امکان پذیر هست یا نه ؟

Salar Ashgi
پنج شنبه 21 بهمن 1389, 00:10 صبح
من که نه قصد نقض قوانین این سایت رو دارم و نه داشتم
شما تو پست های قبلی تون صراحتا" درخواست کد کرده بودید و این یعنی نقض قوانین !


من قوانین رو که خوندم همچین چیزی رو نیافتم پس قسمت کد و آپلود برای زیباییه ؟

شما مثل اینکه موضوع رو متوجه نشدید ، اگه منظورتون دکمه http://barnamenevis.org/images/editor/code.png هستش ، که اصلا ربطی به بحث
ما نداره ، این گزینه یک Tag-Editor ای است جهت قرار دادن کدهای کاربران . بحث ما این هست که :

طبق قانون شماره 27 از قوانین کلی سایت (http://barnamenevis.org/showthread.php?51814-%D9%82%D9%88%D8%A7%D9%86%DB%8C%D9%86-%DA%A9%D9%84%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA) ، هیچ کاربری حق ندارد بطور صریح درخواست کد/پروژه (دانشجویی)
نماید و فقط درخواست راهنمایی راجب مساله مورد نظر مجاز است .

با این اوصاف فعالیت شما در حالت فعلی ناقض قوانین است ، پس اگر میخواهید به نتیجه برسید باید از چنین فعالیت هایی خودداری نمائید !



فقط اگه بگین اینی رو که من میخواستم که 3 عدد رو تبدیل کنم به یک عدد و دوباره بتونم اون عدد رو تبدیل کنم به همون 3 عدد امکان پذیر هست یا نه ؟
ببخشید دوست عزیز ، ما عربی که صحبت نمی کنیم ، تو پست های قبل اگه دقت کرده باشید ، جوابتون داده شد .