
پروژه خیام ۱ : یافتن مجموع ضرایب ۳ و ۵ کوچک تر از ۱۰۰۰
به عنوان اولین برنامه در پروژه خیام : برنامه نویسی با طعم ریاضی می خواهیم برنامه ای بنویسیم که مجموع ضرایب اعداد ۳و۵ را که کوچک تر از ۱۰۰۰ است را پیدا کند .همان طور که قبلا گفتیم در هر پست به سوال های سخت تری می پردازیم و روند ما از سوال های آسان به سخت است پس نگران این نباشید که این سوال آسان است، همین سوال نکته های جالبی دارد .
قبل از شروع اگر نمی دانید پروژه خیام : برنامه نویسی با طعم ریاضی چیست اینجا کلیک کنید .
در این سوال از ما خواسته شده است که مجموع ضرایب ۳و۵ که کمتر از ۱۰۰۰ است را پیدا کنیم . خوب خیلی ساده است می توانیم حلقه هایی (Loop) بگذاریم که مضارب ۳ و ۵ را تولید کند و اعداد تولید شده را با هم جمع کند. مانند حلقه های زیر( MaxNumber = 1000)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | float i=3; float j=5; float sum=0; while(i<MaxNumber) { sum+=i; i+=3; } while(j<MaxNumber) { sum+=j; j+=5; } |
ولی این کافی نیست اگر توجه کنید می بینید که بعضی از اعداد دوبار تولید می شوند که این اعداد همان مضارب ۱۵ هستند پس برای حل این مشکل باید مضارب ۱۵ را از sum که مجوع اعداد تولیدیمان است کم کنیم :
1 2 3 4 5 6 | float z=15; while(z<MaxNumber) { sum-=z; z+=15; } |
خوب کد برنامه مجوع مضارب ۳ و ۵ کوچک تر ۱۰۰۰ این می شود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // program 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #define MaxNumber 1000 //main int main( ) { float i=3; float j=5; float z=15; float sum=0; while(i<MaxNumber) { sum+=i; i+=3; } while(j<MaxNumber) { sum+=j; j+=5; } while(z<MaxNumber) { sum-=z; z+=15; } std::cout<<sum<<std::endl; std::cin.get(); return 0; } |
ولی این راه اول بود راهی بهتر برای تولید ضرایب وجود دارد احتمالا همه ی شما فرمول گوس را که برای جمع اعداد ۱ تا p است را می شناسید :
ولی شاید می پرسید ارتباط این فرمول با ضرایب چیست پس بیایید ضرایب را دقیق تر و با دید دیگری نگاه کنیم :
حالا برنامه مجموع ضرایب ۵ و ۳ را با استفاده از فرمول گوس طور دیگر می نویسیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // program 1.1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #define Maxnumber 1000; int main() { int i=0; int t=0; float sum=0; int j[3]={3,5,15}; for(t=0;t<3;t++) { for(i=999;i>0;i--) { if(i%j[t]==0) { break; } } if(j[t]!=15) { sum += ( ( ( i / j [ t ] ) * ( ( i / j [ t ] ) + 1 ) ) / 2 ) * j[t]; } else { sum -= ( ( ( i / j [ t ] ) * ( ( i / j [ t ] ) + 1 ) ) / 2 ) * j[t]; } } std::cout<<sum<<std::endl; return 0; } |
خوب اگر برنامه را اجرا کنیم عدد ۲۳۳۱۶۸ به دست می آید که مجموع ضرایب اعداد ۳ و ۵ کوچک تر از ۱۰۰۰ است .
امیدوارم از حل این سوال لذت برده باشید اگر راه بهتری داشتید یا برنامه را با زبانی بجز سی پلاس پلاس نوشته اید حتما آن را برای ما ایمیل کنید ، کد شما در همین صفحه قرار خواهد گرفت با تشکر فراوان.
توی این الگوریتم باید مضارب رو در آرایه digs بنویسی و مضارب مشترک رو به صورت منفی باشه تا جواب درست بدست بیاد.
این روش رو میشه با کمی تغییر برای هر چند مضرب که بخوایم اصلاح نمود.
حرف شما کاملا درسته و روش هوش مندانه ای هست
اگه این شکلی بنویسیم هم کوتاه تره هم سریعتر:
for (i=1; i<1000;i++)
if (i%5==0 || i%3==0) sum+=i
الکی ۷ – ۸ خط اضافه کردین!
میشد به جای اینکه هر کدومو جمع کنیم بعد از اونا ضرایب ۱۵ رو کم کنیم تو شرط بگیم اگه مضرب ۳ “و” ۵ بود جمع کنیم
بهترش همون چیزی که شما می گید ولی برای استفاده از فرمول گوس باید مضارب ۱۵ کم کرد از مجموع ضرایب ۳ و ۵
به زبان python
خیلی خوشحال شدم یک طراح وب و توسعه دهنده برای مابرنامه ارسال کرده است.چند وقته زبان python رو به دلیل روانی و تمیزی در کد و سازگاری با بسیاری از سیستم عامل ها در برنامه ام گذاشتم که یاد بگیرم.
خواهش میکنم فرهاد جان
برای شروع یادگیری زبان python میتونی از این سایت استفاده کنی
codecademy.com
این سایت هم یک سایت حل مسائل برنامه نویسی به زبان پیتون در قالب یک محیط جذاب و فان است
checkio.org
موفق باشی
تشکر آقا سعید
اینم برنامه من با زبان برنامه نویسی elixir
خوب چه عیبی داره فرمول رو یک بار بیشتر بنویسی در عوض کدت کوتاه تر می شد و قشنگ تر و اون حلقه های اضافه را به کار نمی بردی .
sara @ زبان برنامه نویسیتون خیلی عجیبه حتی تا حالا اسم elixir نشنیدم، دستوراتش هم عجیبه.تو نظر قبل هم گفتن اون حلقه ها ناشی از وسواس غیر منطقی بود.
به نظرم اگر برنامه بدون حلقه نوشته شود کارایی بالاتری خواهد داشت.
من از همون فرمول گوس استفاده کردم و برنامه رو دوباره نوشتم.
مجید @ استاد تشکر می کنم از این که برای ما برنامه ارسال کردید . من هم با نظر شما موافقم. محدوده را برای برنامه خیلی بیشتر کردم تفاوت زمانی آن خیلی زیاد شد ، فرمول گوس برنامه را خیلی سریع تر می کند. من نمی خواستم فرمول را چند بار بنویسیم به خاطر این در روش دوم حلقه گذاشتم ولی با دیدن برنامه شما فهمیدم خوب از آب در نیومده بهتر بود اون حلقه ها رو استفاده نمی کردم .