تفریق کردن دو رشته که شامل عدد هستند - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تفریق کردن دو رشته که شامل عدد هستند

0 امتیاز

با سلام.من تابعی دارم که دو تا رشته که حاوی عدد هستند رو از هم کم میکنه.برنامه ی من کلی ارور میده.در ضمن من نمیخوام که از روشی که اول رشته رو به int تبدیل میکنیم استفاده کنم چون عدد های من خیلی بزرگند که فقط در قالب رشته جا میگیرند.با تشکر

string sub(string x,string y)
{
        string  min=x,max=y;
	if (x.length()>y.length()){
        max = x;
        min = y;
    } else {
        max = y;
        min = x;
    }
	int i,temp=0;
	int carry=0;
 string z="";
 
 for(i=min.length-1;i>=0;i--)
 {
     temp=max[i+max.length-min.length]-min[i]+carry-2*'0';
     if(temp<0)
     {
         carry=10;
		 max[i+max.length-min.length-1]+='1';
     }
     z=(char)(temp+'0')+z;
 }
  i = max.length() - min.length()-1;
  while(i>=0)
  {
	  temp=max[i]-'0';
	  z=(char)(temp+'0')+z;
	  i--;
  }
  return z;
}
int _tmain(int argc, _TCHAR* argv[])
{
	string a="43";
	string b="9";
	cout<<sub(a,b);
	return 0;
}

 

سوال شده فروردین 10, 1393  بوسیله ی maryam (امتیاز 338)   12 33 44

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

به خاطر اینه که length پرانتز میخواد

اشتباهات کدت رو comment کردم درستشو زیرش گذاشتم

#include <string>
#include <iostream>
using namespace std;
string sub(string x,string y)
{
    string max=y;
    string min=x;

    if (x.length()>y.length()){
        max = x;
        min = y;
    }
    /*ezafi
    else {
        max = y;
        min = x;
    }
    */
    // what if x.length == y.length ??
    int i,temp=0;
    int carry=0;
    string result /* z */=" ";

    for(i=min.length()-1;i>=0;i--)//min.length --> min.length()
    {

        int different=max.length()-min.length();//add
        temp=max[i+different/*max.length()-min.length()*/] - min[i]+carry /*2* '0' */;
        if(temp < 0 )
        {
            carry=10;
            max[i+different-1 /*max.length()-min.length()-1*/]-=1 /*+='1'*/;
            i++;//add
            continue;//add

        }
        else//add
            carry=0;
        //  z=(char)(temp+'0')+z; in shekli bar aks gharar dade mishe adad
        if(i !=0 || temp !=0 ||max.length()!= min.length())//agar ragham aval 0 bashe lazem be ezafe kardan nist
            result.insert(result.begin(),temp + '0');
    }

    i = max.length() - min.length()-1;
    while(i>=0)
    {
        /*
        temp=max[i]-'0';
        z=(char)(temp+'0')+z;
        */
        if(i !=0 || max[i] != '0')//agar ragham aval 0 bashe lazem be ezafe kardan nist
            result.insert(result.begin(),max[i]+carry);
        i--;
    }

    return result;
}
int main()
{
    string a="144";
    string b="4";
    cout<<sub(a,b);
    return 0;
}

 

ضمنا این کد 2 تا مشکل دیگه هم داره که خودت درستشون کن

1- اگر طول 2 تا عدد مساوی باشه ماکزیمم مینیمم رو درست تشخیص نمیده

2- بعضی وقت ها carry رو از چند رقم قبل باید بردازی مثلا  123-201  که این جا هم درست کار نمی کنه برنامت

پاسخ داده شده فروردین 10, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده فروردین 12, 1393 بوسیله ی BlueBlade
سلام.من منظورتون از شماره ی 2 رو نفهمیدم.من برنامه رو با این اصلاحات برای 9-43 اجرا کردم ولی خروجیش e4 شد.به خاطر همین اشکال carry هست؟
تفریق دو رشته ی عددی
سلام.ببخشید این تابع برای 4-144 به جای 140، مقدار 14 رو چاپ میکنه.یعنی صفر رو داخل رشته نهایی درنظر نمی گیره.من فک کنم مشکلش از خط 40 باشه.اگه امکان داره امتحانش کنید.ممنون
آره مشکل از همین خط 40 بود .
درستش کردم .
...