高精度之高精度加減法
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];/