PDA

View Full Version : به دست آوردن قسمت اعشاری یک عدد



naeeme
دوشنبه 02 اردیبهشت 1387, 11:26 صبح
آیا C# تابعی داره که قسمت اعشار یک عدد اعشاری رو بده؟

*******************************************
اگر این تابع وجود نداره، لطفا به این صورت مسئله توجه کنید و یک راه حل با سرعت بالا به من پیشنهاد بدین. سرعت برای من خیلی اهمیت داره:

به طور متوسط 7 میلیون عدد دارم که باید در بین این 7 میلیون عدد، عددی که دارای کمترین مقدار اعشار( بیشترین طول قسمت اعشاری) هست، رو پیدا کنم.
یک روش این هست که برای هر عدد قسمت صحیح عدد رو از کل عدد کم کنم و قسمت اعشار اون رو به دست بیارم و بعد با استفاده از یک حلقه WHILE تعداد ارقام اعشار این عدد رو پیدا کنم.

روش دوم این هست که قسمت اعشار عدد رو به دست بیارم و بعد اون رو به string تبدیل کنم و طول این رشته رو به دست اورده و منهای 2 کنم.

هر دو روش بسیار زمان بر هستند. روش اول در حدود 3 دقیقه و روش دوم در حدود 4.5 دقیقه طول می کشه که هر کاربری باشه به من برنامه نویس فقط بد و بیراه میگه!!:ناراحت:

روش سوم این هست که قسمت اعشار رو به دست بیارم و در یک ArrayList قرار بدم. بعد اون رو مرتب کنم و کوچکترین مقدار رو برگردونم. این به نظر من بهینه ترین در بین این 3 روش هست اما باز هم زمان زیادی می بره( کمتر از 1 دقیقه) که با توجه به زمان بسیار بالای کل عملیات من که در حدود 7 دقیقه هست، این عملیات جزیی، زمان بالایی داره و باید به کمتر از 10 ثانیه برسه.

یه روش بهینه پیشنهاد می کنید؟؟

mehdi.mousavi
دوشنبه 02 اردیبهشت 1387, 23:12 عصر
آیا C# تابعی داره که قسمت اعشار یک عدد اعشاری رو بده؟

*******************************************
اگر این تابع وجود نداره، لطفا به این صورت مسئله توجه کنید و یک راه حل با سرعت بالا به من پیشنهاد بدین. سرعت برای من خیلی اهمیت داره:

به طور متوسط 7 میلیون عدد دارم که باید در بین این 7 میلیون عدد، عددی که دارای کمترین مقدار اعشار( بیشترین طول قسمت اعشاری) هست، رو پیدا کنم.
یک روش این هست که برای هر عدد قسمت صحیح عدد رو از کل عدد کم کنم و قسمت اعشار اون رو به دست بیارم و بعد با استفاده از یک حلقه WHILE تعداد ارقام اعشار این عدد رو پیدا کنم.

روش دوم این هست که قسمت اعشار عدد رو به دست بیارم و بعد اون رو به string تبدیل کنم و طول این رشته رو به دست اورده و منهای 2 کنم.

هر دو روش بسیار زمان بر هستند. روش اول در حدود 3 دقیقه و روش دوم در حدود 4.5 دقیقه طول می کشه که هر کاربری باشه به من برنامه نویس فقط بد و بیراه میگه!!:ناراحت:

روش سوم این هست که قسمت اعشار رو به دست بیارم و در یک ArrayList قرار بدم. بعد اون رو مرتب کنم و کوچکترین مقدار رو برگردونم. این به نظر من بهینه ترین در بین این 3 روش هست اما باز هم زمان زیادی می بره( کمتر از 1 دقیقه) که با توجه به زمان بسیار بالای کل عملیات من که در حدود 7 دقیقه هست، این عملیات جزیی، زمان بالایی داره و باید به کمتر از 10 ثانیه برسه. یه روش بهینه پیشنهاد می کنید؟؟

سلام.

1) آیا این اعداد در بانک ذخیره شدن؟

2) اگر دو عدد 12.1234 و 12.52 رو در نظر بگیریم، شما میخواهید 52 رو با 1234 مقایسه کنید یا تعداد ارقام 52 (2) رو با تعداد ارقام 1234 (4) ؟ یعنی 2 رو با 4؟

naeeme
سه شنبه 03 اردیبهشت 1387, 10:54 صبح
این اعداد در یک فایل باینری قرار دارند که با استفاده از filestream خوانده شده و در یک ماتریس قرار می گیرند.
دقیقا تعداد ارقام قسمت اعشار رو می خوام. اگر مثلا 2 عدد به این صورت داشته باشیم : 1.2105 و 25.001 دقیقا عدد 4 رو می خوام که تعداد ارقام (2105) هست.

mehdi.mousavi
سه شنبه 03 اردیبهشت 1387, 11:25 صبح
این اعداد در یک فایل باینری قرار دارند که با استفاده از filestream خوانده شده و در یک ماتریس قرار می گیرند. دقیقا تعداد ارقام قسمت اعشار رو می خوام. اگر مثلا 2 عدد به این صورت داشته باشیم : 1.2105 و 25.001 دقیقا عدد 4 رو می خوام که تعداد ارقام (2105) هست.

بسیار خوب. اول از همه جای ArrayList از SortedList استفاده کنید و نتیجه رو تست کنید.

در مرحله دوم، عدد رو به String تبدیل کنید (یا اگر میتونید یه ضرب به صورت String از فایل بخونید)، سپس با استفاده از IndexOf جایگاه علامت اعشار رو پیدا کنید، و بقیش هم که دیگه روشنه.

یه روش دیگه که الان به ذهنم رسید اینه که عدد رو Reverse کنید و Log در مبنای ده اون عدد رو حساب کنید و به بالا گردش کنید. به این ترتیب تعداد ارقام عدد رو بدست خواهید آورد. مثلا برای عدد 1.2105 عدد رو ابتدا معکوس می کنیم: 5012.1 سپس Log این عدد در مبنای 10 رو بدست میاریم که میشه: 3.7000 حالا به بالا گردش می کنیم: میشه 4. که تعداد ارقام اون عدد رو نشون میده.

اگر ساختار فایل رو بتونید تغییر بدید، میتونید فایل رو به نحوی ذخیره کنید که هنگام بازیابی در یک لحظه به همه اطلاعات مورد نظرتون برسید.

Sorenaa_s
سه شنبه 03 اردیبهشت 1387, 13:01 عصر
decimal digit = 2356.123M;
decimal newdigit = digit - (int)digit;
int numberOfDigit = newdigit.ToString().Length - 2;
MessageBox.Show( numberOfDigit.ToString() );