PDA

View Full Version : سوال: الگوریتم تقسیم آرایه ای



Arcsinos
پنج شنبه 20 خرداد 1389, 16:44 عصر
سلام دوستان
ما دو تا آرایه داریم که خونه هاش با اعداد 0 تا 9 پر شده حالا میخوایم برنامه ای بنویسیم که آرایه ی اول را به آرایه ی دوم تقسیم کند . توجه کنید که عدد 254 تو برنامه به صورت 4و5و2 هست .
و اینکه مثلا برای جمع دو عنصر اول آرایه هارو جمع میکنیم و نتیجه ی باقیمانده ی تقسیم حاصل جمع رو تو آرای سوم میذاریم والی آخر . برای کم کردن و ضرب کردن هم همینطوریه . ولی تقصیم رو نمیدونم اگه میشه کمک کنید .

nima898
پنج شنبه 20 خرداد 1389, 18:39 عصر
به روشی که تو ابتدایی آموزش دادن باید عمل کرد اول یک رقم از سمت چپ مقسوم جدا کنید و بر مقسوم علیه تقسیم کنید حاصل تقسیم رو به عنصر اول آرایه صفر بنویسید و یک رقم دیگه از مقسوم جدا کنید و در سمت راست باقیمانده قرار بدید و دو باره تقسیم کنید و اینبار حاصل رو در عنصر دوم بنویسید ... تا زمانی که عناصر مقسومبه اتمام برسه

Arcsinos
پنج شنبه 20 خرداد 1389, 21:50 عصر
ممنون ولی نکته اینجاست که عددی رو که میخوایم تقسیم کنیم هم تو آرایه هست . یعنی ما نمیدونیم اون یکان دهگان صدگان یا هر جایگاهی که داره . ما جایگاه اون رو نمیدونیم . اون هم تو یک آرایه قرار داره .

nima898
شنبه 22 خرداد 1389, 07:47 صبح
لطفا یک مثال بزنید
مثلا آرایه های این تقسیم رو مشخص کنید :

1253/47

Arcsinos
دوشنبه 24 خرداد 1389, 11:52 صبح
سلام
اینجوری میشه . البته آرایه هارو تو برنامه اصلی از نوع اشاره گر قراره تعریف کنم تا بشه اندازشون رو متغیر کرد . برای مثال :

short a1[4]={1,2,5,3};
short a2[2]={4,7};

nima898
سه شنبه 25 خرداد 1389, 09:01 صبح
طبق الگوریتمی که نوشتم:
1- عدد 1 بر 47 تقسیم میشود (عدد 1 و عدد 47 رو باید از آرایه استخراج کنید)
2- حاصل میشه 0 با باقیمانده 1
3- عدد 2 رو به باقیمانده متصل کنید میشه. 12 بعد تقسیم بر 47
4- حاصل میشه 0 با باقیمانده 12
5- عدد 5 رو به باقیمانده متصل کنید میشه. 125 بعد تقسیم بر 47
6- حاصل میشه 2 با باقیمانده 31
7- عدد 3 رو به باقیمانده متصل کنید. میشه 313 بعد تقسیم بر 47
8- حاصل میشه 6 با باقیمانده 31
9 ارقام مقسو به اتمام رسید
حاصل هارو موقع محاسبه به هم بچسبونید که میشه 0026 با باقیمانده کلی 31

Arcsinos
سه شنبه 25 خرداد 1389, 10:13 صبح
با تشکر
با توجه به اینکه با استقاده از این برنامه میخواهیم اعداد بسیار بزرگ رو بر هم تقسیم یا ضرب کنیم ، این روش جوابگوی ما نیست فکر کنید آرایه ی دوم یه آرایه ی 1000 عضوی باشه در این صورت کامپیوتر تقسیم 1 بر اون عدد رو انجام نمیده . من دنبال الگوریتمی هستم که هیچ توجهی به عدد نداشته باشه یعنی صرف نظر از اینکه عدد ما 1000 رقمی یه تک رقمیه ولی از جایگاه خونه ها استفاده کنه مثلا در همون مثال عدد 1 در خونه ی 0 قرار داره میتونیم عدد 1 که هزار گانه با :

3^10*1

نشون بدیم . ماباید دنبال اگوریتمی باشیم که به خونه ی عضو نگاه کنه نه به کل مجموعه و عدد . خیلی ممنون میشم اگه کمک کنید . خدا نگهدار

Arcsinos
یک شنبه 10 مرداد 1389, 23:30 عصر
سلام بالاخره یه ماشین حساب درست شد که اعداد 100 رقمی رو ضرب و جمع و تقسیم و تفریق کنه .
2 تا عدد بدید و اوپراتور +،-،*،/ ممنونم از راهنماییهاتون


#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
void input(int[],int[]);
void jame(int[],int[],int[],int);
void tafrigh(int[],int[],int[],int);
void zarb(int[],int[],int[],int);
void taghsim(int[],int[],int[],int);
int _tmain(int argc, _TCHAR* argv[])
{int
first[100]={0},
second[100]={0},
output[200]={0};
int count=199;
char in='y',op='!';
for(int l=0; l<80; l++)cout<<"-";
input(first,second);
cout<<"\nEnter operator: ";
cin>>op;
switch (op){
case '+':jame(first,second,output,count); break;
case '-':tafrigh(first,second,output,count); break;
case '*':zarb(first,second,output,count); break;
case '/':taghsim(first,second,output,count); break;
default : cout<<"Error: the operator valid.";}
getch();
return 0;
}
void input(int first[],int second[]){
int i=0,j=0;
char n1ch[100];
char n2ch[100];
cout<<"\nFirst number : ";
cin.getline(n1ch,98);
cout<<"\nSecond number : ";
cin.getline(n2ch,98);
while(n1ch[i]!=NULL)
i++;
while(n2ch[j]!=NULL)
j++;
for(int a=0;a<i;a++){
if(((int(n1ch[a])-48)>9)||((int(n1ch[a])-48)<0)||(i>99)){
cout<<"\n Error: input must be a number.";
break;}
else
first[100-i+a]=int(n1ch[a])-48;
}
for(int a=0;a<j;a++){
if(((int(n2ch[a])-48)>9)||((int(n2ch[a])-48)<0)||(j>99)){
cout<<"\n Error: input must be a number.";
break;}
else
second[100-j+a]=int(n2ch[a])-48;
}
}

void jame(int first[],int second[],int output[],int count){
for(int k=99; k>=0; k--){
output[count]+=(first[k]+second[k]);
if (output[count]>9){
output[(count-1)]++;
output[count]=(output[count]-10);}
count--;}
while (output[count]==0) count++;
cout<<"\nResult: ";
for(int r=count; r<200; r++){
cout<<output[r];
output[r]=0;}
}
void tafrigh(int first[],int second[],int output[],int count){
int temp;
bool flag=false;
for(int i=0; i<100; i++){
if (second[i]>first[i]){
flag=true;
for(int j=0; j<100; j++){
temp=second[j];
second[j]=first[j];
first[j]=temp;}
break;}
else if (second[i]<first[i]){
flag = false;
break;
}}
for(int k=99; k>=0; k--){
output[count]+=(first[k]-second[k]);
if (output[count]<0){
output[count-1]=(-1);
output[count]=(output[count]+10);}
count--;}
while (output[count]==0) count++;
cout<<"\nResult: ";
if (flag) cout<<"-";
for(int r=count; r<200; r++){
cout<<output[r];
output[r]=0;}
}
void zarb(int first[],int second[],int output[],int count){
int temp[200][100]={{0},{0}};
int t=0;
for(int i=99; i>=0; i--){
int y=199;
for(int j=100; j>0; j--){
temp[y-t][t]+=(second[i]*first[j-1]);
if (temp[y-t][t]>9){
temp[y-t-1][t]=(temp[y-t][t]/10);
temp[y-t][t]=(temp[y-t][t]%10);}
y--;
}
t++;}
for(int f=199; f>=0; f--){
for(int e=99; e>=0; e--)
output[count]+=temp[f][e];
if (output[count]>9){
output[count-1]=(output[count]/10);
output[count]=output[count]%10;}
count--;
}
count++;
while(output[count]==0)count++;
cout<<endl;
for(int q=count; q<200; q++){
cout<<output[q];
output[q]=0;}
}
void taghsim(int first[],int second[],int output[],int count){
int temp[200]={0},tc=0;
bool flag=true;
for(int i=0; i<100; i++)
if (second[i]>first[i]){
cout<<"Error: Taghsim soorat nemigirad!";
flag=false;
break;}
else if (second[i]<first[i]) break;

while(flag){
output[199]++;
for(int a=199;a>=99;a--)
if(output[a]>9){
output[a]=0;
output[a-1]++;}

for(int k=99; k>=0; k--){
temp[count]+=(first[k]-second[k]);
if (temp[count]<0){
temp[count-1]=(-1);
temp[count]=(temp[count]+10);}
count--;}
while(temp[count]==0) {//>OK
first[count-100]=0;
count++;}

for (int r=199;r>=count;r--){
first[r-100]=temp[r];
temp[r]=0;
}

for(int i=0; i<100; i++)
if(second[i]>first[i])
flag=false;
else if(second[i]<first[i])
break;

count=199; }
while (output[tc]==0)tc++;
cout<<"___________\nResult: ";
for(int b=tc;b<200;b++)
cout<<output[b];
cout<<"\n___________";
}

Pouri_sb
دوشنبه 29 آذر 1389, 19:07 عصر
ببینید الگوریتم تقسیم اینه که مقسوم رو از مقسوم علیه تااونجایی کم کنید که حاصل نهایی تفریق از مقسوم علیه کوچکتر بشه، منظورم روش تقریق متوالیه، تعداد دفعات تفریق می شه خارج قسمت و مقدار باقیمانده تفریق آخر می شه باقی مانده کل، مثلا تقسیم 9 بر 2 رو در نظر بگیرید:

9-2=7
7-2=5
5-2=3
3-2 =1
الان 4 بار عمل تفریق انجام شده پس خارج قسمت 4 و باقیمانده هم 1 هست.

فکر کنم کم کردن دو آرایه از هم رو طبقه توضیح اولیتون بلد باشین!

Arcsinos
سه شنبه 30 آذر 1389, 13:47 عصر
دوستان اگه کسی روش دیگه ای برای تقسیم ، به جز تفریق های متوالی داره بگه .
با این روش محاسبه برای تقسیم 100000000 بر 1 حدودا یک دقیقه وقت لازمه ولی ماشین حسابها خیلی سریع این کار رو انجام میدن .
یا اگه میشه الگوریتم تقسیم دودوئی رو بگید . مثلا تقسیم 1010 تقسیم بر 101 باید بیاد 101 .

mehrdad85
سه شنبه 30 آذر 1389, 14:42 عصر
میتونید از روش تقسیم و غلبه استفاده کنید
اینطوری مسئله را به دو قسمت مساوی تقسیم میکنید که هر کدوم ار این دو قسمت مشابه همدیگه حل میشن
اگرم خواستی روش را ارتقا بدی میتونی از الگوریتم هی پویا استفاده کنی که پیچیدگی الگوریتمتو خیلی خیلی پایین میارن
اگه توضیح بیشتر خواستی بگو تا بیشتر توضیح بدم

امیدوارم مفید بوده باشه برات

Arcsinos
سه شنبه 30 آذر 1389, 22:09 عصر
با تشکر
ولی آیا روش تقسیم و غلبه برای ضرب اعداد بزرگ استفاده نمیشه ؟
اگه برای تقسیم اعدا بزرگ هم استفاده میشه لطفا توضیحات بیشتری بفرمایید .

Arcsinos
دوشنبه 18 بهمن 1389, 17:35 عصر
کسی میتونه الگوریتمی رو که تو این قسمت (http://barnamenevis.org/showthread.php?272086-تقسیم-با-استفاده-از-شیف-دادن) قرار دادم رو تو مبنای 10 پیاده سازی کنه ؟ این الگوریتم ، الگوریتم تقسیم دودویی هست .

misam490
شنبه 23 بهمن 1389, 18:34 عصر
کسی میتونه الگوریتمی رو که تو این قسمت (http://barnamenevis.org/showthread.php?272086-تقسیم-با-استفاده-از-شیف-دادن) قرار دادم رو تو مبنای 10 پیاده سازی کنه ؟ این الگوریتم ، الگوریتم تقسیم دودویی هست .

ممنون arcsin جان کمک بزرگی کردی ده دهیشو نوشتم توضیحات خیلی خوب و جامع ای بود.

ali24j
دوشنبه 14 اردیبهشت 1394, 11:52 صبح
آقا خدا خیرت بده خیلی خیلی برنامه ی جالبی بود !!!
من هم حتما راجب الگوریتم های دیگه ای برای اینکار فکر،تحقیق و کار میکنم !!!
باز هم ممنون !!!
علی
:تشویق::تشویق::تشویق::تشویق:: شویق::تشویق::تشویق::تشویق::ت ویق::تشویق::تشویق: