本文是经过例子学习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