日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

大数问题(C++、Java)

發(fā)布時(shí)間:2023/12/1 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数问题(C++、Java) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有時(shí)候,當(dāng)我們做題的時(shí)候會(huì)遇到很簡(jiǎn)答的代碼題,例如A+B,但是題是有前提的,就是兩個(gè)數(shù)特別的大。媽耶~~~
大家都知道,定義一個(gè)變量,系統(tǒng)會(huì)自動(dòng)為該變量分配空間,例如:int類型在c中,占2個(gè)字節(jié),也就是16位,即可以存儲(chǔ)0~216-1這么大的數(shù),如果再大,就算是long long int也會(huì)溢出報(bào)錯(cuò)。
咋辦捏?
這時(shí)候,大數(shù)問(wèn)題出來(lái)了

C++版

一、大數(shù)相加

大數(shù)相加思路:

1 2 3 4 5 6 7 8 9 1 5 4 7 8 9 6 3 5 1 2 4 5 8 7 4 2 + 1 8 9 6 4 5 8 9 6 3 1 4 5 6 3 5 8 9 6 2 9 8 = 1 2 3 4 6 14 16 14 7 6 13 13 13 11 10 10 8 11 4 7 12 14 14 9 13 10 滿十向前一位進(jìn)一 = 1 2 3 4 7 5 7 5 3 7 4 4 4 2 1 0 9 1 4 8 3 5 5 0 4 0

首先,從最低位對(duì)應(yīng)相加,之后再進(jìn)行每一位判斷,若滿十,將取余保留,取整加到前一位即可。

(大數(shù)輸入絕大多數(shù)是以字符串接收)

核心代碼如下:

string BigNumAdd(const string& strNum1, const string& strNum2) {string strSum;//用來(lái)存儲(chǔ)最后的結(jié)果int len1 = strNum1.size()-1;//獲取第一個(gè)數(shù)的長(zhǎng)度int len2 = strNum2.size()-1;//獲取第二個(gè)數(shù)的長(zhǎng)度int bit = 0; //保存進(jìn)位//從結(jié)尾開(kāi)始每位相加 while (len1>=0 && len2>=0){//分別從兩數(shù)的末尾開(kāi)始相加 由于是字符的形式,而接下來(lái)需要對(duì)數(shù)進(jìn)行取余和取整的操作,所以這時(shí)要將每個(gè)位求和之后獲得整數(shù)的形式,需要 -‘0’int tmpSum = strNum1[len1]-'0' + strNum2[len2]-'0' + bit;//求每位的和(要把進(jìn)位也加上)strSum += tmpSum % 10 + '0';//保存進(jìn)結(jié)果 bit = tmpSum / 10;//求進(jìn)位 --len1;--len2; }//兩個(gè)整數(shù)長(zhǎng)度不相等(肯定有一個(gè)已經(jīng)加完了,不需要再額外加if來(lái)判斷,因?yàn)閣hile就可以判斷)while (len1 >= 0)//說(shuō)明第一個(gè)數(shù)要大些,這時(shí)候,第二個(gè)數(shù)已經(jīng)沒(méi)法與第一數(shù)位數(shù)對(duì)應(yīng)了{//和上個(gè)while循環(huán)一樣int tmpSum = strNum1[len1]-'0' + bit;//獲得數(shù)字形式strSum += tmpSum % 10 + '0';//保存進(jìn)結(jié)果 bit = tmpSum / 10;//求進(jìn)位--len1; }while (len2 >= 0) {//和上個(gè)while循環(huán)一樣int tmpSum = strNum2[len2]-'0' + bit;//獲得數(shù)字形式strSum += tmpSum % 10 + '0';//保存進(jìn)結(jié)果 bit = tmpSum / 10;//求進(jìn)位--len2; }//當(dāng)跳出三個(gè)循環(huán)之后,bit最后存儲(chǔ)的是最高一位數(shù)的進(jìn)位與否,進(jìn)行判斷//最高位有進(jìn)位if (bit != 0)//需要進(jìn)位strSum += bit + '0'; //由于咱們是從低位開(kāi)始以次存入字符串里的,所以最后的輸出得逆序輸出reverse(strSum.begin(), strSum.end()); //反轉(zhuǎn)return strSum; }

二、大數(shù)相乘

大數(shù)相乘思路:

1 2 3 4 5 7 8 9 6 3 5 9 8* 6 3 5 1 4= 4 8 12 16 20 28 32 36 24 12 20 36 32 4與第一個(gè)數(shù)的各個(gè)位相乘 = 1 2 3 4 5 7 8 9 6 3 5 9 8 1與第一個(gè)數(shù)的各個(gè)位相乘 = 5 10 15 20 25 35 40 45 30 15 25 45 40 5與第一個(gè)數(shù)的各個(gè)位相乘 = 3 6 9 12 15 21 24 27 18 9 15 27 24 3與第一個(gè)數(shù)的各個(gè)位相乘 = 6 12 18 24 30 42 48 54 36 18 30 54 48 6與第一個(gè)數(shù)的各個(gè)位相乘 然后,與加法相同,豎行每一列對(duì)應(yīng)為相加,可以進(jìn)位則向前進(jìn)位 = 6 15 29 44 63 88 110 134 130 117 110 126 127 86 69 44 32 = 7 8 4 1 3 0 4 8 2 9 3 9 6 3 3 7 2

首先,將相對(duì)小的數(shù)的最低位與相對(duì)大的數(shù)的每一位進(jìn)行相乘,然后相對(duì)小的數(shù)的倒數(shù)第二位數(shù)再以次與相對(duì)大的數(shù)的每一位相乘…直到相對(duì)小的數(shù)的最高位與相對(duì)大的數(shù)的每一位相乘之后,再以次求和相加即可。

核心代碼如下:

string BigNumMultiply(const string& strNum1, const string& strNum2) {string strMultiply;//兩數(shù)相乘最大有m+n位int bit = 0;//保留進(jìn)位int len1 = strNum1.size()-1;//獲取第一個(gè)數(shù)的長(zhǎng)度int len2 = strNum2.size()-1;//獲取第二個(gè)數(shù)的長(zhǎng)度//計(jì)算每一位 for (int i=0; i<len1+len2+2; ++i){//計(jì)算結(jié)果的第i位(權(quán)值肯定為i,第1位也就是個(gè)位權(quán)值為0(pow(10, 0))) //等于乘數(shù)的第(i~0)位分別與被乘數(shù)的第(0~i)位相乘,因?yàn)檫@樣每位相乘之后權(quán)值仍為i //然后相加再加上前一位的進(jìn)位,就是結(jié)果的第i位//然后%10得出第i位,/10得到進(jìn)位int tmp = 0;for (int j=i; j>=0; --j){//如果下標(biāo)超出字符串的范圍 j為num1的下標(biāo), i-j為num2的下標(biāo),然后兩數(shù)相乘 if (j>len1 || (i-j)>len2)continue;//還要注意字符串?dāng)?shù)字的最高位在字符串的最低位所以得用len減去 tmp += (strNum1[len1-j]-'0') * (strNum2[len2-(i-j)]-'0');//從低位開(kāi)始加,一列一列相加,相錯(cuò)相乘再相加}//加上進(jìn)位tmp += bit;//為了防止最后一位是0,但是卻加上了if (tmp == 0 && i == len1+len2+1) //最后一位,也就是最高位為0,則沒(méi)必要往strMultiply 該字符串里面存,因?yàn)槟嫘蜉敵龅臅r(shí)候,0是最高位,沒(méi)有意義的。break;//求余得到結(jié)果的第i位strMultiply += tmp % 10 + '0';//計(jì)算新的進(jìn)位bit = tmp / 10; }//反轉(zhuǎn)reverse(strMultiply.begin(), strMultiply.end()); return strMultiply; }

三、大數(shù)階乘

核心代碼如下:
string rlt("1");string opNum;for (int i=1; i<=n; ++i){//ss不可以定義在for循環(huán)外stringstream ss; ss << i;ss >> opNum;rlt = BigNumMultiply(rlt, opNum); }

Java版

一、大數(shù)相乘

計(jì)算兩個(gè)非負(fù)整數(shù) A,B的乘積,A,B可能會(huì)很大。

輸入格式
第一行輸入一個(gè)非負(fù)整數(shù) A。

第二行輸入一個(gè)非負(fù)整數(shù) B。

A,B的長(zhǎng)度不大于 500。

輸出格式
輸出 A×B 的值。

樣例輸入
4321
1234
樣例輸出
5332114

代碼如下:

import java.math.BigInteger;//導(dǎo)入相關(guān)的BigInteger包 import java.util.Scanner;//導(dǎo)入掃描儀Scanner public class main {public static void main(String[] args) { Scanner sq=new Scanner(System.in); BigInteger a,b,result2; a=sq.nextBigInteger(); b=sq.nextBigInteger(); result2=a.multiply(b); System.out.println(result2); } }

二、大數(shù)相加

計(jì)算兩個(gè)非負(fù)整數(shù)A,B的和。不過(guò)這一次有些特殊A,B可能會(huì)很大。

輸入格式
第一行輸入一個(gè)非負(fù)整數(shù)A。
第二行輸入一個(gè)非負(fù)整數(shù)B。
A,B的長(zhǎng)度不大于 500。
輸出格式
輸出A+B的值。不要有多余的前導(dǎo)零。
樣例輸入
123000000000
1234000000000
樣例輸出
1357000000000

代碼如下:

import java.math.BigDecimal; import java.util.Scanner; public class bigteger {public static void main(String[] args) {BigDecimal a,b,c;Scanner sq=new Scanner(System.in);while(true){a=sq.nextBigDecimal();b=sq.nextBigDecimal();c=a.add(b);if(c.compareTo(BigDecimal.ZERO) == 0)//此處equal是不可以的,因?yàn)闀?huì)將精度也算進(jìn)去System.out.println("0");elseSystem.out.println(c.stripTrailingZeros().toPlainString());} } } BigDecimal是處理高精度的浮點(diǎn)數(shù)運(yùn)算的常用的一個(gè)類 一般直接使用 BigDecimal.toString()方法即可以完成浮點(diǎn)數(shù)的打印。System.out.println( new BigDecimal("100.000").toString()); 100.000System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString()); 1E+2stripTrailingZeros()函數(shù)就是用于去除末尾多余的0的,而輸出是科學(xué)計(jì)數(shù)法System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString()); 100 用toPlainString()函數(shù)代替toString(),避免輸出科學(xué)計(jì)數(shù)法的字符串

(保留小數(shù)點(diǎn)的方法)代碼如下:

import java.math.BigDecimal; import java.util.Scanner; public class Main {public static void main(String[] args) {BigDecimal a,b,c;Scanner sq=new Scanner(System.in);a=sq.nextBigDecimal();b=sq.nextBigDecimal();c=a.add(b);BigDecimal e=c.setScale(2,BigDecimal.ROUND_HALF_UP);//里面的2這個(gè)參數(shù)代表保留兩位小數(shù)System.out.println(e);} }

詳細(xì)博文參考:https://blog.csdn.net/qq_39101581/article/details/78624617

總結(jié)

以上是生活随笔為你收集整理的大数问题(C++、Java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。