سلام دوست عزيز
چند تا سوال (و نكته) ميخوام عرض كنم :
1- روش روستايي يعني چي؟
2- اگه قرار باشه اندازه آرايه شما متغير باشه يا از ورودي عددها رو بگيرين كل برنامه تحت تاثير قرار ميگيره اونوقت چي كار بايد بكنين؟ نميشه كه واسه هر تغيير ورودي شما كدتون رو اصلاح كنيد.
دوباره به خودم ثابت شد که برنامه نویسی Syntax بلد بودن یا شعار دادن نیست!
3- منظورتون رو متوجه نشدم، ميبخشي يه مقدار خنگم و فقط syntax بلدم ولي فكر كنم شما هم يه مقدار دوپهلو صحبت فرموديد.
4- بهينه شدن تا چه حد واستون لازمه؟ اگه واسه تحويل پروژه تون ميخواين، نمونه هايي كه تو پست قبلي اشاره شد جوابتون رو ميدن ولي اگه واسه يه كار كابردي ميخواين و يه كد كامل كه تمام عملگرها رو شامل بشه يه كلاس هست كه از اينجا ميتونين بردارينش و توسط آقاي مسعود اقدسي فام نوشته شده كه اين كد پايين هم قسمت ضربش هست : من الان دارم اين هدر رو با اجازه ايشون (نويسنده برنامه) تو پروژه هامون استفاده ميكنم و نقص هاي خيلي كمي داشت كه با همفكري حل شد و يه يونيت تقريبا كامل و كاربردي شده (هموني كه لينكش رو دادم) كه تو سي شارپ هم تقريبا همين كلاس رو پياده سازي كرده و دارم استفاده ميكنم.
BigInteger operator * ( const BigInteger &r ) const
{
BigInteger temp;
if( !data || !r.data )
return temp;
if( *this == "0" || r == "0" )
{
temp.data = new char[ 1 ];
if( temp.data )
{
temp.size = 1;
temp.sign = false;
temp.data[ 0 ] = '0';
return temp;
}
}
vector< unsigned > v( size + r.size );
unsigned i, j, t, c;
for( i = 0 ; i < size ; i++ )
{
c = 0;
for( j = 0 ; j < r.size ; j++ )
{
t = v[ i + j ];
v[ i + j ] = ( t + c + ( data[ i ] - '0' ) * ( r.data[ j ] - '0') ) % 10;
c = ( t + c + ( data[ i ] - '0' ) * ( r.data[ j ] - '0' ) ) / 10;
}
if( c )
v[ i + j ] = c;
}
for( i = 0 ; i < v.size() ; i++ )
if( v[ v.size() - i - 1 ] != 0 )
break;
temp.data = new char[ v.size() ];
if( temp.data )
{
temp.size = v.size() - i;
temp.sign = ( sign && !r.sign ) || ( !sign && r.sign );
for( j = 0 ; j < temp.size ; j++ )
temp.data[ j ] = v[ j ] + '0';
}
return temp;
}
5- تو اين مدت كمي كه اينجا بودم به اين نتيجه رسيدم كه گذاشتن كد كامل درخواستي واسه دوستان با عرض معذرت باعث بدعادتي دوستان ميشه و دردسرهايي (از جمله سيل پيغامهاي خصوصي در مورد انجام پروژه هاي دانشجويي شون!) براي خودم ايجاد ميكنه : در نتيجه من يه تابع ساده واسه جمع دو تا عدد بزرگ نوشتم كه فقط واسه ايده دادن به شما بوده و سعي كردم كه تا حد امكان نزديك كد خودتون باشه و ليست پيوندي و كلاس و عملگر و ... توش نباشه؛ اميدوارم بدرد شما و دوستان ديگه بخوره و اگه مشكلي بود مشتاقم در موردش صحبت كنيم چون عجله اي نوشتم :
#define MAX_DIGITS 50
char * Add2Number( char *Number1
, int Num1Len
, char *Number2
, int Num2Len)
{
int i, MaxLen, MinLen, deficient, CarryOut = 0;
char Larger[ MAX_DIGITS ],
Smaller[ MAX_DIGITS ],
SumResult[ 2 * MAX_DIGITS ],
DigNum;
if (Num1Len > Num2Len)
{
strcpy(Larger, Number1); MaxLen=Num1Len;
strcpy(Smaller, Number2); MinLen=Num2Len;
}
else
{
strcpy(Larger, Number2); MaxLen=Num2Len;
strcpy(Smaller, Number1); MinLen=Num1Len;
}
deficient = MaxLen - MinLen;
SumResult[MaxLen] = '\0';
for (i=0; i<MaxLen; i++)
{
Larger[i] -= 48;
if (i<MinLen) Smaller[i] -=48;
}
for (i=MinLen-1; i>=0; i--)
{
SumResult[i + deficient] = Larger[i + deficient]
+ Smaller[i] + CarryOut;
CarryOut = SumResult[i + deficient] / 10;
SumResult[i + deficient] = SumResult[i + deficient] % 10;
}
SumResult[deficient - 1] = Larger[deficient - 1] + CarryOut;
for (i=0; i<deficient - 1; i++)
SumResult[i] = Larger[i];
for (int i=0; i<MaxLen; i++)
SumResult[i] += 48;
return SumResult;
}
با تشكر.