1. 程式人生 > >高精度之高精度加減法

高精度之高精度加減法

C++ 該死的高精度加減法

  沒看書直接硬上的結果是,一個簡單的高精度減法我用了一個多小時只寫了一個90分的程式碼。之前準備NOIP的時候確實是學了,可惜現在早就還給老師了。

結果回家一看標準程式,頓時有種想哭的趕腳。

  先上我的90分程式碼:

//高精度減法
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector> 
#include<cstdio>
using namespace std; string a,b; int dif,dns=0; vector<int>c; void change(string x,string y) { dif=abs(x.size()-y.size()); // cout<<dif; int len=max(x.size(),y.size()); // cout<<len; for(int i=len-1;i>=0;i--) { // cout<<"orz"; int a=x[i]-'0'+dns,b=y[i-dif]-'0'
; if(len-i > y.size()) { // cout<<"$$$$$$$$$$$$$$$$"; b=0; } int p=a-b; // if(i==0) cout<<a<<endl<<b<<"orz"; // cout<<a<<'\t'<<p<<'\t'; dns=0; if (p < 0) { if(i==0
&& dif==0 ) { cout<<'-'; dns=0; c.resize(0); change(y,x); return; } p+=10; dns=-1; } // printf("%d____________\n",p); // cout<<p<<'/'; c.push_back(p); } // cout<<"|||||||||||||||"<<endl;; if(dif==1&&x[0]=='0') return; // cout<<c.size()<<endl; } int main() { cin>>a>>b; if (a.length() < b.length() ) { cout<<'-'; change(b,a); } else { change(a,b); } // cout<<c.size(); for(int i=c.size()-1;i>=0;i--) { // cout<<"orz"<<i<<endl; cout<<c[i]; } return 0; }

裡面充斥著大量d_bug的語句,見證著我的血與淚。這個程式碼錯誤的地方就在於我選擇了string也就是字串,這樣的話比較大小上會很複雜,但是如果用char陣列的話就沒有這麼麻煩了,直接用strcmp就可以搞定,可是苦逼的我當時就是沒想到(咳咳!!好吧,其實我是想用string裝逼來著)。

下面是用char寫的程式碼:

***************麻蛋上次寫到這裡忘了儲存,還得重新寫。

參考了標程,突然發現了上面程式的缺點,就是當兩個數相等時,會輸出0000000000000,但是隻要加上下面一句話:

if(a == b) {
cout<<’0’;
return 0;
}
  妥妥的AC!!!!

所以我終於意識到了一個問題:string可以比較大小!!!!我終於吃著屎寫出了一個完美的程式碼。。。

程式碼如下:


//高精度減法
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector> 
#include<cstdio>
using namespace std;
string a,b;
int dif,len1,dns=0,len2;
vector<int>c;
void change(string x,string y)
{
    dif=abs(x.size()-y.size());
    int len=max(x.size(),y.size());
    for(int i=len-1;i>=0;i--)
    {
        int a=x[i]-'0'+dns,b=y[i-dif]-'0';
        if(len-i > y.size()) {
            b=0;
        }
        int p=a-b;
        dns=0; 
        if (p < 0) {
            p+=10;
            dns=-1;
        }
        c.push_back(p);
    }
}
int main()
{
    cin>>a>>b;
    len1=a.size();
    len2=b.size();
    if(a == b) {
        cout<<'0';    
        return 0;
    }
    if ( a.length() < b.length()||(len1==len2 && a<b )) {
        cout<<'-';
        change(b,a);
    }
    else if(len1>len2||(len1==len2 && a>b ))
    {
        change(a,b);
    }
//    cout<<c.size();
        int con=1;
    for(int i=c.size()-1;i>=0;i--)
    {
//        cout<<"orz"<<i<<endl;
                if(c[i]==0&&con)continue;
                con=0;
        cout<<c[i];
    }
    return 0;
}

包含著血與淚的勝利//

  這裡不得不提一下string的比較規則,比較時並不涉及長度,從第一位開始,按照字典序比較,如果a是b的子串,那麼b>a。

至於高精度加法,比減法簡單很多,程式碼貼在下面:

//高精度加法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
string a,b;
int len1,len2,len,lenn,dif,dns=0;
vector<int>qaq;
void change(string x,string y)
{
    for(int i=len-1;i>=0;i--) {
        int m=x[i]-'0'+dns,n=y[i-dif]-'0';
        if(len-i > y.size() ) n=0;
        int p=m+n;
        dns=0;
        if(p>=10) {
            p-=10;
            dns=1;
        }
        qaq.push_back(p);
    }
    if(dns)qaq.push_back(dns);
}
int main()
{
    cin>>a>>b;
    len1=a.size();
    len2=b.size();
    len=max(len1,len2);
    dif=abs(len1-len2);
    if(len1 >= len2) change (a,b);
    else change (b,a);
    int con=1,qq=0;
    for (int i=qaq.size()-1;i>=0;i--) {
        if(con==1&&qaq[i]==0) continue;
        con=0;
        cout<<qaq[i];
        qq++;
    }
    if(!qq) cout<<'0';
    return 0;
}

  好吧,我又一次栽在了0這一個點上還有就是注意最後的進位可能需要單獨放進vector陣列中。

相關推薦

精度精度加減法

C++ 該死的高精度加減法   沒看書直接硬上的結果是,一個簡單的高精度減法我用了一個多小時只寫了一個90分的程式碼。之前準備NOIP的時候確實是學了,可惜現在早就還給老師了。 結果回家一看標準程式,頓時有種想哭的趕腳。   先上我的90分程式碼:

精度精度除法(精除以精)

好像NOIP並不會用到,但是作為強迫症的我還是堅持學了。高精度除以高精度我所知道的有兩個思路: 手動模擬法 還是手動模擬除法過程,但是注意在截取了被除數的正確片段之後應該試商,即列舉k從1到9看當k等於多少才合適,但是如果每次迴圈都試一邊的話時間複雜度必

精度精度除法(精除以低精)

一.整除版高精度除法: 思路,手動模擬除法過程,包括餘數用X記錄,每次讀到新位計算出被除數,然後計算。 //高精度除法 整除版 #include<iostream> #in

精度精度乘法

話說高精度乘法真的沒有什麼好介紹的,直接上程式碼: #include<cstdio> #include<cstdlib> #include<algorithm>

初識精度P1096 HanoiHanoiHanoi雙塔問題

這道題是一道用來練習遞推的經典題目,但是在推出遞推關係式,滿心歡喜將程式碼提交後只通過了四組資料,i can’t believe that;馬上溜去看題解,嗯,一個大牛說這是道水題(沒毛病),用高精度提交就可以了。。。。 高精度???我就乖乖滾去百度了 題目如下 題目描述 給定AAA

C++精度演算法精度減法

高精度減法 題目描述 高精度減法 輸入 兩個整數a,b(第二個可能比第一個大) 輸出 結果(是負數要輸出負號) 樣例輸入 2 1 樣例輸出 1 說明 20%資料a,b

大數精度java處理

例題1 原題: Octal Fractions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6648 Accepted: 3627 Description Fractions in

精度精度階乘

class tro 分享 sub data pid ble clu 問題 問題 F: 【高精度】高精度階乘 時間限制: 1 Sec 內存限制: 64 MB提交: 297 解決: 58[提交] [狀態] [討論版] [命題人:] 題目描述 《魔法寶典》對於修羅王是如此重

精度精度乘法

con img sub alt 狀態 圖片 hide num mst 問題 J: 【高精度】高精度乘法 時間限制: 1 Sec 內存限制: 64 MB提交: 286 解決: 94[提交] [狀態] [討論版] [命題人:] 題目描述 牢門上的第三道鎖,需要使用高精度乘

大數,精度計算---精度冪次

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

精度精度

問題 D: 【高精度】高精度冪 時間限制: 1 Sec  記憶體限制: 64 MB 題目描述 經過測試,修羅王發現開啟魔法手銬的方法是需要求一個正整數a(1<a<10100)的N(1<N<108)次方,但只要求輸出最後100

精度乘法(精乘精)(C語言實現)

原始碼&註釋 #include <stdio.h> #include <string.h> char s[10000],ss[10000]; int a[10000],b[10000],c[10000]; int len,l

#141-(EZOI精度練習)[精度]n!的精確值

Description 輸入 n,輸出 n! 的精確值,n!=1×2×3×…×n,1<n<1000。 Sample Input 100 Sample Output 93326215

#143-[精度]精度精度

Description 輸入兩個整數x,y,輸出它們的商和餘數。 Input 輸入兩個整數x,y(0 <= x,y <= 10^100) Output 輸出共計兩行,第一行為它們的

精度精度分數[c++]

【高精度】高精度分數

精度演算法】A/B 精度除以低精度 保留小數

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

C++ 精度加法 精度減法 精度乘法1

轉自:http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html 前言:由於計算機運算是有模運算,資料範圍的表示有一定限制,如整型int(C++中int 與long相同)表達範圍是(-2^31~2^31-1),unsigned

精度精度FFT優化演算法

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <map> #include

精度乘法入門詳解(精乘精)

高精度乘法。輸入兩個正整數,求它們的積。 【演算法分析】 類似加法,可以用豎式求乘法。在做乘法運算時,同樣也有進位,同時對每一位進行乘法運算時,必須進行錯位相加,如圖3、圖4。 分析c陣列

資訊學奧賽一本通演算法(C++版)基礎演算法:精度計算 精度加法(大位相加)

2018年資訊學奧賽NOIP資料下載 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char a1[100],b1[100]; 6 int a[100],b[100],c[100];/