ورود

View Full Version : سوال: بردن عدد به مبناي دلخواه



ميثم طاهري
شنبه 14 دی 1387, 17:52 عصر
ميشه بگيد عدد رو چطور ميشه به مبناي مختلف برد.مثلا به مبناي 2.

araelectronic@ymail.com
شنبه 14 دی 1387, 20:07 عصر
با سلام
با تقسيم متوالي و كنترل باقيمانده اين كا را انجام دهيد

Salar Ashgi
شنبه 14 دی 1387, 20:36 عصر
سلام ، همانطور که دوستمون گفتند این راه معمولشه ، ولی یک تابع بازگشتی هم میتوان نوشت که

هر عدد رو به هر مبنایی ببره !!!

موفق و پیروز باشید !!!!

lvlina_r
شنبه 14 دی 1387, 23:39 عصر
ميشه بگيد عدد رو چطور ميشه به مبناي مختلف برد.مثلا به
مبناي 2.


#include <stdio.h>
#include <iostream.h>
#include <conio.h>
int change_base(int n, int b, char *pc);
void main()
{
int n;
int b;
char aray[11];
cin>> n ;

cin >> b;
change_base(n, b, aray);

}
int change_base(int n, int b, char *pc)
{
int m=n, count=0;
while(n)
{
pc[count]=(n%b);
switch (pc[count])
{ case 0:
pc[count]='0';
break;
case 1:
pc[count]='1';
break;
case 2:
pc[count]='2';
break;
case 3:
pc[count]='3';
break;
case 4:
pc[count]='4';
break;
case 5:
pc[count]='5';
break;
case 6:
pc[count]='6';
break;
case 7:
pc[count]='7';
break;
case 8:
pc[count]='8';
break;
case 9:
pc[count]='9';
break;
case 10:
pc[count]='A';
break;
case 11:
pc[count]='B';
break;
case 12:
pc[count]='C';
break;
case 13:
pc[count]='D';
break;
case 14:
pc[count]='E';
break;
case 15:
pc[count]='F';
break;
case 16:
pc[count]='G';
break;
case 17:
pc[count]='H';
break;
case 18:
pc[count]='I';
break;
case 19:
pc[count]='J';
break;
case 20:
pc[count]='K';
break;
}
n=n/b;
count++;
}
for (int j=count-1;j>=0;j--)
{
cout << pc[j] ;
}
return 0;
}

من اينا نوشتم
كارم ميده
ولي زياد قشنگ نيست........

obscure
یک شنبه 15 دی 1387, 13:46 عصر
منم اینو نوشتم در ضمن بازگشتی هم نیست...ولی خیلی ساده تر از اون کدی هست که
دوست قبلی نوشتن....

#include<iostream.h>
#include<conio.h>
void change_base(int num,int base);
int main()
{
int n,b;
cout<<"enter number:";
cin>>n;
cout<<"enter base:";
cin>>b;
change_base(n,b);
getch();
return 0;
}
//**************************
void change_base(int num,int base)
{
int a[10],i=0;
do
{
a[i] = num % base;
i++;
num = num / base;
}
while(num >= base);
cout<<num;
for(int k=i-1;k>=0;k--)
cout<<a[k];
}

zoofa
یک شنبه 15 دی 1387, 19:38 عصر
سلام
من قبلاً یک برنامه نوشتم که این کار را انجام می دهد
این برنامه تمام مبناهای 1 تا 16 را به یکدیگر تبدیل می کند.
این برنامه وقتی عدد و مبنای اولی را وارد می کنید عدد را چک می کند اگر در آن مبنا قرار داشت تبدیل می کند
این برنامه مبنا را می گیرد و عدد را به مبنای ده می برد و سپس به مبنای خواسته شده می برد


#include <iostream.h>
#include <conio.h>
#include <math.h>
//----------------------------------------------//
char MyChar(long int num)
{
char a;
if (num <= 9 && num >= 0) a = num + 48;
else if (num == 10) a = 'A';
else if (num == 11) a = 'B';
else if (num == 12) a = 'C';
else if (num == 13) a = 'D';
else if (num == 14) a = 'E';
else if (num == 15) a = 'F';
return a;
}
//----------------------------------------------//
long int Myflag(long int mabna ,char num[])
{
long int i = 0 , counter = 0;
long int mynum;
long int flag = 1;

for ( i =0 ; num[i] != '\0' ; i++)
{
if (num[i] >=48 && num[i] <=57) mynum = num[i]-48 ;
else if (num[i] == 'A' || num[i] == 'a') mynum = 10;
else if (num[i] == 'B' || num[i] == 'b') mynum = 11;
else if (num[i] == 'C' || num[i] == 'c') mynum = 12;
else if (num[i] == 'D' || num[i] == 'd') mynum = 13;
else if (num[i] == 'E' || num[i] == 'e') mynum = 14;
else if (num[i] == 'F' || num[i] == 'f') mynum = 15;
if (mynum >= mabna) flag = 0;
}
return flag;
}
//----------------------------------------------//
long int Myten(long int mabna , char num[])
{
long int i = 0 , count = 0 , counter = 0;
long int ten = 0;
long int mynum;
for (i = 0 ; num[i] != '\0' ; i++ ) counter++;
counter--;
for ( i = counter ; i >=0 ; i--)
{
if (num[i] >=48 && num[i] <=57) mynum = num[i]-48 ;
else if (num[i] == 'A' || num[i] == 'a') mynum = 10;
else if (num[i] == 'B' || num[i] == 'b') mynum = 11;
else if (num[i] == 'C' || num[i] == 'c') mynum = 12;
else if (num[i] == 'D' || num[i] == 'd') mynum = 13;
else if (num[i] == 'E' || num[i] == 'e') mynum = 14;
else if (num[i] == 'F' || num[i] == 'f') mynum = 15;
ten =ten +(mynum * pow(mabna , count));
count++;
}
return ten;
}
//----------------------------------------------//
int main()
{
clrscr();
long int mabna1 , mabna2 , count = 0 , ten , i , mod;
char all[100] , number , num[100];
cout << "Please Enter The Input Base= ";
cin >> mabna1;
cout << "Please Enter The Number= ";
cin >> all;
if (!Myflag (mabna1 , all))
{
cout << "\nThe Number Does Not Math With The Input Base";
}
else
{
cout << "Please Enter The Output Base= ";
cin >> mabna2;
ten = Myten (mabna1 , all);
mod = ten % mabna2;
num[0] = MyChar(mod);
while (ten >= mabna2)
{
ten /= mabna2;
mod = ten % mabna2;
count++;
num[count] = MyChar(mod);
}
for (i = count ; i >= 0 ; i--)
{
cout << num[i];
}
}
getch();
return 0;
}

ميثم طاهري
یک شنبه 15 دی 1387, 19:42 عصر
سلام
من قبلاً یک برنامه نوشتم که این کار را انجام می دهد
این برنامه تمام مبناهای 1 تا 16 را به یکدیگر تبدیل می کند.

#include <iostream.h>
#include <conio.h>
#include <math.h>
//----------------------------------------------//
char MyChar(long int num)
{
char a;
if (num <= 9 && num >= 0) a = num + 48;
else if (num == 10) a = 'A';
else if (num == 11) a = 'B';
else if (num == 12) a = 'C';
else if (num == 13) a = 'D';
else if (num == 14) a = 'E';
else if (num == 15) a = 'F';
return a;
}
//----------------------------------------------//
long int Myflag(long int mabna ,char num[])
{
long int i = 0 , counter = 0;
long int mynum;
long int flag = 1;

for ( i =0 ; num[i] != '\0' ; i++)
{
if (num[i] >=48 && num[i] <=57) mynum = num[i]-48 ;
else if (num[i] == 'A' || num[i] == 'a') mynum = 10;
else if (num[i] == 'B' || num[i] == 'b') mynum = 11;
else if (num[i] == 'C' || num[i] == 'c') mynum = 12;
else if (num[i] == 'D' || num[i] == 'd') mynum = 13;
else if (num[i] == 'E' || num[i] == 'e') mynum = 14;
else if (num[i] == 'F' || num[i] == 'f') mynum = 15;
if (mynum >= mabna) flag = 0;
}
return flag;
}
//----------------------------------------------//
long int Myten(long int mabna , char num[])
{
long int i = 0 , count = 0 , counter = 0;
long int ten = 0;
long int mynum;
for (i = 0 ; num[i] != '\0' ; i++ ) counter++;
counter--;
for ( i = counter ; i >=0 ; i--)
{
if (num[i] >=48 && num[i] <=57) mynum = num[i]-48 ;
else if (num[i] == 'A' || num[i] == 'a') mynum = 10;
else if (num[i] == 'B' || num[i] == 'b') mynum = 11;
else if (num[i] == 'C' || num[i] == 'c') mynum = 12;
else if (num[i] == 'D' || num[i] == 'd') mynum = 13;
else if (num[i] == 'E' || num[i] == 'e') mynum = 14;
else if (num[i] == 'F' || num[i] == 'f') mynum = 15;
ten =ten +(mynum * pow(mabna , count));
count++;
}
return ten;
}
//----------------------------------------------//
int main()
{
clrscr();
long int mabna1 , mabna2 , count = 0 , ten , i , mod;
char all[100] , number , num[100];
cout << "Please Enter The Input Base= ";
cin >> mabna1;
cout << "Please Enter The Number= ";
cin >> all;
if (!Myflag (mabna1 , all))
{
cout << "\nThe Number Does Not Math With The Input Base";
}
else
{
cout << "Please Enter The Output Base= ";
cin >> mabna2;
ten = Myten (mabna1 , all);
mod = ten % mabna2;
num[0] = MyChar(mod);
while (ten >= mabna2)
{
ten /= mabna2;
mod = ten % mabna2;
count++;
num[count] = MyChar(mod);
}
for (i = count ; i >= 0 ; i--)
{
cout << num[i];
}
}
getch();
return 0;
}

ميثم طاهري
دوشنبه 16 دی 1387, 23:35 عصر
ممنون از همه دوستان

ميثم طاهري
سه شنبه 17 دی 1387, 22:17 عصر
اگر صرفا بخوام كه به مبناي 10 ببرم از چه تابعي بايد استفاده كنم؟

h_motamed123
چهارشنبه 18 دی 1387, 00:09 صبح
این که کار ساده ای است اول باید بدونی تو چه مبنایی هست بعد یه الگوریتم بنویس که تعداد ارقام رو مشخص میکنه وبعد رقم nام را در اون مبنا به توانn ضرب میکنی فقط یادت باشه اعشاری ها توان منفی لازم دارند

Nima_NF
چهارشنبه 18 دی 1387, 00:10 صبح
به جای این همه کد چرا از توابع استاندارد C و ++C استفاده نمی کنید؟
مانند strtol

به این شکل که عدد را با itoa یا سایر توابع استاندارد به رشته تبدیل می کنید و سپس با strtol و از طریق پارامتر سوم پایه مورد نظر را مشخص می کنید تا به مبنای آن تبدیل و ذخیره شود:
http://www.barnamenevis.org/forum/showthread.php?t=114469

ميثم طاهري
چهارشنبه 18 دی 1387, 00:13 صبح
این که کار ساده ای است اول باید بدونی تو چه مبنایی هست بعد یه الگوریتم بنویس که تعداد ارقام رو مشخص میکنه وبعد رقم nام را در اون مبنا به توانn ضرب میکنی فقط یادت باشه اعشاری ها توان منفی لازم دارند
مثلا مبناي 2

h_motamed123
چهارشنبه 18 دی 1387, 00:23 صبح
ببخشید اما کد نویسیش دیگه دست خودتون رو میبوسه دیگران فقط باید راهنمایی کنن
اگه هم گنگ بود بگید بیشتر راهنمایی تون میکنم
در ضمن راه حل که مدیر گفتن خیلی بهتره

ميثم طاهري
چهارشنبه 18 دی 1387, 00:27 صبح
به جای این همه کد چرا از توابع استاندارد C و ++C استفاده نمی کنید؟
مانند strtol

به این شکل که عدد را با itoa یا سایر توابع استاندارد به رشته تبدیل می کنید و سپس با strtol و از طریق پارامتر سوم پایه مورد نظر را مشخص می کنید تا به مبنای آن تبدیل و ذخیره شود:
http://www.barnamenevis.org/forum/showthread.php?t=114469
به جرات مي تونم بگم از اين لينكي كه داديد چيزي متوجه نشدم:لبخند:

zoofa
چهارشنبه 18 دی 1387, 03:52 صبح
سلام
برای یردن یک عدد از یک مبنا به مبنای 10 باید از سمت راست، رقم را ضربدر (مبنا به توان مکان آن عدد) کنید.
مکان آن عدد از 0 شروع می شود.
مثال برای تبدیل عدد 5471202 از مبنای 8 به 10 به ترتیب زیر عمل می کنیم

0 ^ 8 * 2
+
1 ^ 8 * 0
+
2 ^ 8 * 2
+
3 ^ 8 * 1
+
4 ^ 8 * 7
+
5 ^ 8 * 4
+
6 ^ 8 * 5
=
1471106


حالا اگر مبنا عدد دیگری است به جای رنگ های سبز مبنای خود را می گذاری و رنگ های قرمز هم که عددی است که می خواهی تبدیل کنی و عددهای آبی هم که از 0 شروع می شود
اگر سوال داشتی در خدمتیم :متفکر:
التماس دعا

Nima_NF
چهارشنبه 18 دی 1387, 12:24 عصر
برای متوجه شدن تنها کاری که لازم بود انجام بدید این بود که یک مرتبه آن ها را تست می کردید:

یک مثال دیگر:



//#include<stdio.h>

int num = 15;
char binaryStr[50];
char hexStr[20];

itoa( num, binaryStr, 2 );
itoa( num, hexStr, 16 );

عدد را از ورودی در num می ریزیم، سپس با پارامتر سوم مبنا برای تبدیل را مشخص می کنیم، عدد تبدیل شده در رشته ها ذخیره می شود.
در مثال فوق به ترتیب 1111 و F در رشته ها ذخیره می شود.

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

ميثم طاهري
پنج شنبه 19 دی 1387, 12:03 عصر
نميشه يه تابع بازگشتي ايجاد كرد كه صرفا عدد رو به مبناي خاصي ببره؟

parvartish
سه شنبه 18 فروردین 1388, 06:11 صبح
من تازه c++ یاد گرفتم.اولین بار هم هست که به این فروم اومدم(خیلی خیلی ازش خوشم اومد و عضوش هم شدم)
من یه برنامه نوشتم که اعداد رو از مبنای 10 به 2 و بالعکس میبره.امیدوارم به دردت بخوره.



#include<iostream.h>
#include<iomanip.h>
void main()
{long a[10],n,j,m,i,k,p,s,t,r,z,c;
cout<<" exit:inter 0"<<"\n";
while(m!=0&&k!=0)
{
cout<<" 'what you want to go to the base , 2 or 10'"<<"\n";
cin>>m;
if(m==2)
{
cout<<" inter your number"<<"\n";
cin>>n;
k=n;
while(n>0)
{
for(i=0;n>0;i++)
{
a[i]=n%2;
n=n/2;
}
cout<<"\n";
cout<<k<<" in base 2 is:";
for(j=i-1;j>=0;j--)
cout<<setw(2)<<a[j];
cout<<"\n";
}
cout<<"\n";
}
if(m==10)
{
z=0;
c=1;
cout<<" inter your number"<<"\n";
cin>>n;
cout<<"\n";
k=n;
while(n!=0)
{
r=n%10;
z=z+r*c;
c=c*2;
n=n/10;
}
cout<<k<<" in base 10 is:";
cout<<z<<"\n";
cout<<"\n";
}
if(m!=2&&m!=10&&m!=0)
cout<<" you must only inter 2 or 10"<<"\n";
}
cout<<" close the window,please"<<"\a";
}

Salar Ashgi
جمعه 25 دی 1388, 15:06 عصر
نمیشه یه تابع بازگشتی ایجاد کرد که صرفا عدد رو به مبنای خاصی ببره؟

می بینید عمل جستجو چقدر زیباست ، البته بشرطی که انجام بشه .

http://www.barnamenevis.org/forum/showpost.php?p=872389&postcount=66

ali zi zeperto
شنبه 26 دی 1388, 15:21 عصر
از این روش هم میشه استفاده کرد.البته برای مبنای ۲ نداره.
cout<<hex<<number;
cout<<oct<<number;
cout<<dec<<number;

eyplus
جمعه 01 اسفند 1393, 13:37 عصر
سلام دوستان خسته نباشین
من یه مشکلی دارم.میخوام برنامه ی تبدیل مبنای 10 به 2 رو با استفاده از تابع void که غیر بازگشتی باشه بنویسم.اما شک دارم به کدی که نوشتم
کسی میتونه راهنمایی کنه؟
ممنون میشم