我使用 TDM-GCC 4.9.2 64 位版本(Bloodshed Dev-C++ 中内置的版本)编译了以下代码:
#include <iostream>
using namespace std;
const int MAXN=1005;
int a[MAXN],b[MAXN],c[MAXN];
void input(int a[]){
string s;
cin >> s;
int len=s.length();
for(int i=0;i<MAXN;i++) a[i]=0;
for(int i=len-1;i>=0;i-=4){
a[0]++;
for(int j=max(0,i-3);j<=i;j++){
a[a[0]] *= 10;
a[a[0]] += s[j]-'0';
}
}
}
void output(int a[]){
for(int i=a[0];i;i--){
if(i==a[0])
cout << a[i];
else{
int tmp=1000;
for(int j=1;j<=4;j++){
cout << a[i]/tmp%10;
tmp /= 10;
}
}
}
}
void add(int c[],int a[],int b[]){
for(int i=0;i<MAXN;i++) c[i]=0;
c[0]=max(a[0],b[0]);
for(int i=1;i<=c[0];i++){
if(i<=a[0]) c[i]+=a[i];
if(i<=b[0]) c[i]+=b[i];
}
for(int i=1;i<=c[0];i++){
c[i+1] += c[i]/10000;
c[i] %= 10000;
}
while(c[c[0]+1]>0){
c[0]++;
c[c[0]+1] = c[c[0]]/10000;
c[c[0]] %= 10000;
}
}
int main(){
int t,c=0;
cin >> t;
for(int r=0;r<t;t++){
input(a);
input(b);
add(c,a,b);
cout << "Case " << ++c << ":" << endl;
output(a);
cout << " + ";
output(b);
cout << " = ";
output(c);
cout << endl << endl;
}
return 0;
}
这是针对这个问题编写的一段高精度加法代码。 当我编译时,编译器报告以下错误: 我不知道这个错误,请问我该如何修复它?
总结并回答主要问题,在 main 中本地声明的 int 变量 c 掩盖了全局 int 数组的声明,也称为 c。
int main(){
int t,c=0; //This variable shadows global array called c
cin >> t;
for(int r=0;r<t;t++){
input(a);
input(b);
add(c,a,b);
cout << "Case " << ++c << ":" << endl;
output(a);
cout << " + ";
output(b);
cout << " = ";
output(c);
cout << endl << endl;
}
return 0;
}
正如其他人指出的,在 C++ 中你最好使用 STL 数组。即更换
const int MAXN = 1005;
int a[MAXN],b[MAXN],c[MAXN];
由
constexpr std::size_t MAXN = 1005;
std::array<int, MAXN> a, b, c;
(函数参数类型相同)
此外,最好避免使用单字母变量名称并提供更具描述性的名称,这可以避免遮盖已使用的字母:)