昨天写了个C语言的高精度加法,今天就想写一个Java版的,但写的过程中猛然发现下标越界了。又想起昨天C语言的版本里在进行计算的过程中下标也越界了。。。但它并没有报错,简单试了几个数据竟然还过了。。。据说是为了提高运行效率所以C语言不检查下标越界。。。有一丝丝尴尬。
高精度加法
/*高精度加法的Java实现*/
import java.io.*;//用于读取数据
public class gjd {
private static int[] num1=new int[100];//储存第一个数
private static int[] num2=new int[100];//储存第二个数
private static int[] ans=new int[100];//储存结果
private static char[] cnum=new char[100];//以字符形式临时储存数据,便于判断数据结束
public static void main(String[] args)throws IOException {//用于读取数据
int i,j,m,n;
i=j=1;
boolean p=true;//保持循环
while(p){
cnum[i]=(char)System.in.read();
if(cnum[i]=='\n'){ //判断数据结束
i=i-1;
break;
}
num1[i]=cnum[i]-48;//转换储存第一个数
i++;
}
while(p){
cnum[j]=(char)System.in.read();
if(cnum[j]=='\n'){
j--;
break;
}
num2[j]=cnum[j]-48;//转换储存第二个数
j++;
}
if(i>j) n=i;//初步判断结果长度
else n=j;
m=n;//备份结果长度
for(;n>=1;){
if(i>0&&j>0) ans[n]=num1[i]+num2[j]+ans[n];
else if(i>0) ans[n]=num1[i]+ans[n]; //保证下标不越界的运算
else if(j>0) ans[n]=num2[j]+ans[n];
i--;j--;
if(ans[n]>=10){
ans[n]=ans[n]-10;//进位处理
ans[n-1]++;
}
n--;
}
if(ans[0]>0) i=0;//判断结果长度
else i=1;
for(;i<=m;i++){//输出结果
System.out.print(ans[i]);
}
}
}
今天写高精度的时候同学问我有什么用,一下子把我问住了。我沉思许久,得出结论:高精度加法就是一种通过一次运算一位数的方式突破数据类型对数据大小的限制进行加法运算的算法。
看着这句令人难受的话,我好像知道自己语文为什么总考不好了。。。