PDA

View Full Version : سوال: دریافت عدد در مبنای 16 درturbo c



computer_science
دوشنبه 14 دی 1388, 23:27 عصر
با سلام
من یه بار دیگه هم این سوال رو پرسیده بودم اما جواب درستی دریافت نکردم
سوالم اینه
چطور میتونیم 2 عدد 20 رقمی در مبنای 16 دریافت کنیم و حاصلضرب آنها را در مبنای 16 چاپ کنیم؟
اصل مشکل من هم اینه که چطور یه عدد در مبنای 16 دریافت کنم؟
ممنون میشم یه نفر جوابمو بده

qwerty11
سه شنبه 15 دی 1388, 10:03 صبح
مبنای 16 میدونین چجوریه دیگه !؟

خوب معلومه که اعداد رو باید به صورت char[] در نظر بگیری.

اعداد رو مبنای 10 نبر و محاسبات رو تو همون مبنای 16 انجام بده!!

max_15s
سه شنبه 15 دی 1388, 10:46 صبح
عدد در مبنای 16 رو به صورت رشته می گیرن ، بعد یک آرایه عددی معادلش می سازن ، بعد اعضای رشته رو به آرایه عددی متناظر می کنن



|A|5|B| رشته
آرایه عددی |11|5|10|

علامت | رو برای جدا کردن خانه های آرایه بکار بردم

بعد مثل ضرب اعداد بزرگ (با استفاده از آرایه) ضرب می کنن و فقط در هر مرحله برای عمل carry ضرب در حالت در مبنای 10


if(a[n] > 9)
{
a[n+1] += a[n] /10;
a[n] %= 10;
}
بکار می رفت حالا در مبنای 16 به صورت زیر می شه



if(a[n] > 15)
{
a[n+1] += a[n] / 16;
a[n] %= 16;
}مثلا

B*F

11*15 = 165
a[1] = 165 / 16; --> 10
a[0] = 165 % 16; --> 5

که جواب می شود

10 | 5 --> A5جستجو کنید همه سال ها ، همه ی دانشجو ها باید این برنامه ها رو بنویسن ، قبلا خیلی در این موارد بحث شده.

computer_science
شنبه 19 دی 1388, 13:49 عصر
با سلام
با تشکر برای جوابتون
فقط یه سوال
چه طو وقتی 2 عدد را باهم ضرب کردیم به صورت رشته در بیاریم

computer_science
یک شنبه 20 دی 1388, 11:44 صبح
می خواستم ببینم کجای این برنامه اشکال داره که اجرا نمیشه




#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int toInt(unsigned char);
unsigned char toHex(unsigned int);
unsigned char *enlarge(unsigned char*,unsigned int);
unsigned char *reverse(unsigned char*);
unsigned char *add(unsigned char*,unsigned char*);
unsigned char *mul(unsigned char*,unsigned char*);
void printNumber(unsigned char*);

int main()
{
char number1[30],number2[30];
printf("Enter Number1: ");
scanf("%s",number1);
printf("Enter Number2: ");
scanf("%s",number2);
printf("Results:\n",number2);
printNumber(number1);
printf(" * ");
printNumber(number2);
printf(" = ");
printNumber(mul(number1,number2));
printf("\n");
return 0;
}
unsigned int toInt(unsigned char hex){
if(hex>='0'&&hex<='9')
return (unsigned int)hex-'0';
if(hex>='a'&&hex<='f')
return (unsigned int)(hex-'a')+10;
if(hex>='A'&&hex<='F')
return (unsigned int)(hex-'A')+10;
fprintf(stderr,"Error: %c is not in hex format!\n",hex);
exit(1);
return 0;
}
unsigned char toHex(unsigned int num){
if(num>16)
return toHex(num%16);
if(num>9)
return (num-10)+'A';
return num+'0';
}
unsigned char *enlarge(unsigned char *input,unsigned int length)
{
unsigned char *tmp=malloc(sizeof(unsigned char)*(length+1));
unsigned int pad=length-strlen(input),i=0;
for(;i<pad;i++)
tmp[i]='0';
tmp[pad]=0;
strcat(input,tmp);
return input;
}
unsigned char *reverse(unsigned char *input)
{
unsigned int len=strlen(input),i;
unsigned char *ret=malloc(sizeof(unsigned char)*(len+1));
for(i=0;i<len;i++){
ret[i]=input[len-i-1];
}
ret[len]=0;
return ret;
}
unsigned char *mul(unsigned char *a,unsigned char *b)
{

unsigned char *ret="0",*tmp;

unsigned int i=0,j=0,k=0,len1=strlen(a),len2=strlen(b),res;
a=reverse(a);
b=reverse(b);
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
{
res=toInt(a[i])*toInt(b[j]);
tmp=malloc(sizeof(unsigned char)*(3+i+j));
tmp[1]=toHex(res);
tmp[0]=toHex((unsigned int)(res/16));
for(k=0;k<i+j;k++)
tmp[k+2]='0';

tmp[i+j+2]=0;
ret=add(ret,tmp);
}
}
return ret;
}
unsigned char *add(unsigned char *a,unsigned char *b)
{
unsigned int num1=strlen(a),num2=strlen(b),res=0,i=0;
unsigned char *ret=malloc(sizeof(unsigned char));
a=reverse(a);
b=reverse(b);
if(num1<num2)
a=enlarge(a,num2);
else if(num1>num2)
b=enlarge(b,num1);
while(*a!=0 && *b!=0)
{
num1=toInt(*a);
num2=toInt(*b);
a++;
b++;
res+=num1+num2;
ret=(unsigned char *)realloc(ret,sizeof(unsigned char)*(i+1));
ret[i]=toHex(res);
res=(unsigned int)(res/16);
i++;
}
if(res!=0){
ret=(unsigned char *)realloc(ret,sizeof(unsigned char)*(i+1));
ret[i]=toHex(res);
i++;
}
ret=(unsigned char *)realloc(ret,sizeof(unsigned char)*(i+1));
ret[i]=0;
return reverse(ret);
}
void printNumber(unsigned char *number)
{
int started=0;
while(*number!=0)
{
if(started==1||*number!='0')
{
printf("%c",*(number++));
started=1;
}
else
number++;
}
}

computer_science
سه شنبه 22 دی 1388, 10:38 صبح
یعنی هیچکس تو این سایت نیست که بتونه ایرادهای این برنامه رو بگیره