簡體   English   中英

我在這個程序上遇到雙乘錯誤

[英]I am getting a Double Multiplication error on this program

此問題不適用於下面指定的測試用例。 我認為長雙數的乘法一定有一些錯誤

#include<bits/stdc++.h>
using namespace std;
 
string multiplyStrings(string , string );
 
int main() {
     
    int t;
    cin>>t;
    while(t--)
    {
        string a;
        string b;
        cin>>a>>b;
        
        cout<<multiplyStrings(a,b)<<endl;
    }
     
}// } Driver Code Ends


/*You are required to complete below function */
string multiplyStrings(string s1, string s2) {
   int sign = 1;
   bool up1 = false;
   bool up2 = false;
   char ch1;
   char ch2;
   stringstream ss1(s1);
   stringstream ss2(s2);
   if(s1[0]=='-') {
       sign = -1;
       up1 = true;
       
   }
   if(s2[0]=='-') {
       sign = -1;
       up2 = true;
   }
   long double a, b, prod;
   if(up1 == true && up2 == true) {
        ss1 >> ch1 >> a;
        ss2 >> ch2 >> b;
        prod = a * b;
   }
   else if(up1 == true) {
        ss1 >> ch1 >> a;
        ss2 >> b;
        if(a==0 || b==0) {
            prod = 0;
        } else {
            prod = a * b * sign;
        }
   }
   else if(up2 == true) {
        ss1 >> a;
        ss2 >> ch2 >> b;
        if(a==0 || b==0) {
            prod = 0;
        } else {
            prod = a * b * sign;
        }
   }
   else {
        ss1 >> a;
        ss2 >> b;
        prod = a * b*1.0;
   }
   ostringstream strNew; 
   strNew << prod;
   string newSt = strNew.str(); 
   return newSt;
}

將此測試用例用於程序輸入:4416 -333

它的正確輸出是:-1470528

你的代碼的輸出是:-1.47053e+06 請幫我看看代碼?? 並給出解決方案。

只需使用

strNew << fixed;

或者

strNew.setf(ios_base::fixed, ios_base::floatfield);

輸出前。 在任何情況下,它都有助於將浮點值顯示為小數。

您的輸出采用指數格式,因為您的數據是 long double 類型。 用戶EOF給了你一個提示:

strNew << fixed << prod;

然而,如果我是你的教授,我會用一些超大的數字來測試你的程序,這些數字會導致值太大而無法用不四舍五入的長雙精度來表達。 您可能要問是否需要支持任意大的值。

如果這樣做,那么您需要一種完全不同的算法,可能是一種以類似於在紙上手工完成的長算術的方式來實現解決方案的算法。

如果你不明白我的意思,我推薦谷歌搜索:

c++ number of significant digits long double

您可能有 30 位左右的有效數字,因此您可以准確地顯示由 30(ish) 個 9 組成的數字,但不能顯示由 40(ish) 個 9 組成的數字。

用你的程序試試(一旦你修復了輸出)。 將 40 個 9 乘以 1,看看你會得到什么。

現在,您的教授可能實際上並未對此進行測試。 但是,如果您正在以這種方式完成將單個數字相乘的工作,而不是僅對兩個值使用 stoi() * stoi() ,那么這是有原因的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM