例题
代码
#include <cstdio>int main(){long long a,b;scanf("%lld %lld",&a,&b);printf("%lld\n",a+b);}
例题——高精度加法
编程计算:1234567891234567891212121+1231212121212121212121222222111112121=?
分析
加法步骤
1. 将输入的两行数字当作字符串
2. 初始化三个数组,要求数组的每个元素都是0,以便存储字符串的每一位值
3. 将两个字符串的每一位都转成数字,然后倒序存入数组中(个位对齐)
4. 根据最长字符的长度确定计算次数:两个数组从0到最长数组的长度进行相同序号元素的加法,和存入第三个数组的对应序号中
5. 对第三个数组进行调整,如果值超过或等于10,那么就让下一序号的元素加上十位数字,当前序号取模10的值
6. 倒序输出调整后的数组,注意,如果两个数产生进位就要让倒序输出的开始位置后移一位
遇到的深坑
这题由于对C++初始化内存分配不理解导致很长时间没有做出来,经过学习明白了C++的初始化原理:
- main函数中定义的临时变量存储在内存的栈中,不赋初值时默认为脏数
- new声明的变量存储在内存的堆中,不赋初值时默认为脏数
- 声明的全局变量存储在内存的全局/静态存储区中,不赋初值时默认为0
C++初始化总结:
在C++中,不同存储位置的变量在初始化时会有不同的行为:
-
堆中的变量(使用
new
操作符动态分配的):- 对于基本数据类型(如
int
,char
,float
,double
等),如果没有显式初始化,它们的内容是未定义的。这意味着它们可能包含任何值,这取决于分配内存时的状态。 - 对于类类型的对象,如果没有显式调用构造函数,编译器会尝试调用默认构造函数(如果存在的话)。如果没有定义默认构造函数,编译器会报错。
- 对于基本数据类型(如
-
全局/静态存储区的变量:
- 对于基本数据类型,全局变量和静态变量在程序开始执行之前会被自动初始化为0(对于数值类型)或者空字符(对于
char
类型)。 - 对于类类型的全局变量和静态变量,如果提供了默认构造函数,该构造函数会被用来初始化变量。如果没有提供默认构造函数且没有显式初始化,编译器会报错。
- 对于基本数据类型,全局变量和静态变量在程序开始执行之前会被自动初始化为0(对于数值类型)或者空字符(对于
-
栈中的变量(局部变量):
- 对于基本数据类型,局部变量如果没有显式初始化,则它们的值是未定义的。这意味着它们可能包含任何值,这取决于函数被调用时栈的状态。
- 对于类类型的局部变量,如果没有显式调用构造函数且没有提供默认构造函数,编译器会报错。如果提供了默认构造函数,那么对象会使用默认构造函数进行初始化。
总结:
- 堆中的变量和栈中的基本数据类型变量如果没有显式初始化,则它们的值是未定义的。
- 全局/静态存储区的变量无论基本数据类型还是类类型,都会被自动初始化为默认值(对于基本数据类型是0或空字符,对于类类型是调用默认构造函数)。
- 类类型的变量(无论在哪个存储区)如果没有定义默认构造函数且没有显式初始化,编译器会报错。
为了编写健壮且可维护的代码,建议总是显式初始化你的变量,无论是全局的、静态的、堆上的还是栈上的。这可以避免潜在的运行时错误和难以调试的问题。
高精度加法代码
#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
#include <iostream>
using namespace std;int main(){string s1,s2;char str1[200],str2[200];int num_1[200]={0};int num_2[200]={0};int num_3[200]={0};//fgets(str1,200,stdin);//fgets(str2,200,stdin);scanf("%s ",str1);scanf("%s",str2);s1 = str1;s2 = str2;//getline(cin,s1);//getline(cin,s2);for(int i=0;i<s1.size();i++){num_1[s1.size()-i-1]=str1[i]-'0';}for(int i=0;i<s2.size();i++){num_2[s2.size()-i-1]=str2[i]-'0';}int len = max(s1.size(),s2.size());for(int i=0;i<len;i++){num_3[i] = num_1[i]+num_2[i] ;}for(int i=0;i<len;i++){if(num_3[i]>=10){num_3[i+1] = num_3[i+1] + num_3[i]/10;num_3[i] = num_3[i]%10;}}if(num_3[len]!=0){len++;}for(int i =len-1;i>=0;i--){printf("%d",num_3[i]);}printf("\n");return 0;
}
例题——计算Sn(北京大学机试)
分析
用递归
代码
#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
#include <iostream>
using namespace std;unsigned long long caculate(int a,int n){if(n==1){return a;}return a+10*caculate(a,n-1);
}int main(){int a,n;scanf("%d%d",&a,&n);unsigned long long sum=0;for(int i=1;i<=n;i++){sum+=caculate(a,i);}printf("%lld",sum);return 0;
}