本文是經過例子學習C++的第五篇,經過這個例子能夠快速入門c++相關的語法。html
在上一篇中,咱們經過字符數組計算2<sup>64</sup>次方:ios
帶着這個問題:爲何用字符數組,不用整數數組,開始本文。算法
本題目直接實現,有點複雜,咱們先計算1+2+3+...100的和,總結規律後再來計算。數組
這個是一個經典的循環問題,能夠用for、while、do-while求和。學習
#include<iostream> using namespace std; int main(){ int sum = 0; for(int i=1;i<=100;i++){ sum += i; } cout<<"for求1+2+3+...+100之和是:"<<sum<<endl; sum = 0; int t = 1; while(t<=100){ sum += t; t ++; } cout<<"while求1+2+3+...+100之和是:"<<sum<<endl; sum = 0; t = 1; do{ sum += t; t ++; }while(t<=100); cout<<"do-while求1+2+3+...+100之和是:"<<sum<<endl; return 0; }
比較for、while和do-while的實現,咱們發現累加求和的通用規則是在循環體中sum += t;
從而實現累加求和的通用形式。spa
程序運行效果以下圖:code
該問題能夠歸爲「算法」中的一類,稱之爲高精度計算。htm
當須要計算的兩個數很是大,用字符數組存儲,本文中分別用數組n計算2的次方,用sum數組存儲和。blog
同2中的方法,求數組n和數組sum的和,只須要對應位求和便可。其中涉及的進位規則位,此處數組a,b,c均爲整數數組:
c[i]=a[i]+b[i]; if (c[i]>=10) { c[i]%=10; ++c[i+1]; }
實現代碼以下:
#include<iostream> using namespace std; int main(){ char n[32],sum[32]; int a,b,jin=0,temp=0; //初始化數組 n[0] = '1'; for(int i=1;i<32;i++){ n[i] = '0'; } //初始化求和數組 for(int i=0;i<32;i++){ sum[i] = '0'; } //循環64次,每次數組的值乘以2 for(int j=0;j<64;j++){ jin = 0; //從最低位開始,計算乘以2後各個位上的值:`當前值*2+進位`,而後轉換爲字符 for(int i=0;i<32;i++){ a = (n[i]-'0') * 2; n[i] = a%10 + jin + '0'; jin = a/10; } //求和 jin = 0; for(int k=0;k<32;k++){ temp = sum[k] - '0' + n[k] - '0' + jin; sum[k] = temp % 10 + '0'; if(temp>=10){ jin = temp /10; }else{ jin = 0; } } } cout<<"2的1次方+2的2次方+...2的64次方的和是:"; for(int i=31;i>=0;i--){ cout<<sum[i]; } return 0; }
程序運行後效果以下:
上述實現方法遠非最優,經過該例子,能夠學習:
原文出處:https://www.cnblogs.com/siweihz/p/12194119.html