PDA

View Full Version : کمک در نوشتن برنامه کار با اعداد بزرگ به زبان سی شارپ



armiya
یک شنبه 18 مرداد 1394, 21:33 عصر
با سلام
من میخوام یه برنامه بنویسم که فرمول ترکیب اعداد بزرگ رو حساب کنه در واقع تمام جایگشت های ممکنه رو با دادن ورودی n و k بتونه تو خروجی نشون بده (منظورم از اعداد بزرگ مثلا تا 500 هستش) .
به عنوان مثال اگه ورودی ما 1و2و3 باشند و من از ورودی n=3 و k=2 بدم خروجی بصورت
1,2
1,3
2,3
باشه جهت واضح بودن من فرمول ترکیب رو برحسب n وk گذاشتم 134100
راستش من خودم یه کدی نوشتم ولی کلی هم تو نت گشتم ولی متاسفانه کدی پیدا نکردم که این شرایط رو محقق کنه فقط کدی بود که تمام حالات ممکنه رو میداد یعنی میومد از جایگشت بیتی استفاده میکرد و تمام تر کیبات ممکنه رو میداد اگه ممکنه کمک کنین ممنون

ahmadreza.s
یک شنبه 18 مرداد 1394, 22:51 عصر
سلام
به نظرم بیا با رشته ها کار کن ! مثلن واسه ضرب ، اصولی که تو دوران ابتدایی خوندیم رو اجرا کن ! و هر خونه ی یه رشته میشه یک رقم !

من خودم اینجوری جمع اعداد رو نوشتم ! مثلن تا 2000 میلیون رقم هم میشه باهاش جمع کرد !

حالا اگه الگوریتم یا روش دیگه ای هم هست من اطلاعی ندارم

armiya
دوشنبه 19 مرداد 1394, 14:24 عصر
من نمیدونم این کد چرا اجرا نمیشه

public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k)
{
return k == 0 ? new[] { new T[0] } :
elements.SelectMany((e, i) =>
elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] { e }).Concat(c)));
}
ولی باز فکر نکنم درست باشه برای اعداد بزرگ

rahnema1
دوشنبه 19 مرداد 1394, 16:19 عصر
سلام
می تونید از تابع زیر استفاده کنید

void nchoosek (int[] v, int[] buffer, int k, int i = 0)
{
int n = v.Length;
int b = buffer.Length;
for (int j = i; j < n - k + 1; j++)
{
buffer[b-k] = v[j];
if (k > 1){

nchoosek(v, buffer, k - 1, j + 1);
}
else
{
printfbuf(buffer);
}
}
}

void printfbuf(int [] buffer)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for (int i = 0; i < buffer.Length; i++) {
sb.Append( buffer[i]).Append(" ,");
}
sb.AppendLine();
Console.WriteLine(sb.ToString());
//richTextBox1.Text += sb.ToString();
}

نحوه استفاده هم به این صورته که مثلا مجموعه اعداد 1 تا 5 دارید و بخواهید دو تا دو تا چاپ کنید
nchoosek((new int[]{1,2,3,4,5}), new int[2], 2);

اگه بخواهید سه تا سه تا باشه:
nchoosek((new int[]{1,2,3,4,5}), new int[3], 3);