TDM-GCC编译高精度加法代码出现int转int*错误的修复求助
错误原因与修复方案
核心错误原因
你在main函数里定义了局部变量int c=0;,而全局作用域已经存在数组int c[MAXN];。C++中局部变量会覆盖同名的全局变量,导致调用add(c,a,b)和output(c)时,编译器使用的是局部的int类型变量c,但add和output函数要求的参数是int*(数组作为参数传递时会退化为指针),因此触发了int转int*的非法转换错误。
修复步骤
- 重命名局部变量:将
main里的int c=0;改成其他名字,比如int case_cnt=0;,同时修改后续输出语句里的++c为++case_cnt,避免和全局数组c冲突。 - 修复循环增量错误:
main中的for(int r=0;r<t;t++)是错误的,循环增量应该是r++而不是t++,否则循环无法正常执行。
修复后的完整代码
#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,case_cnt=0; cin >> t; for(int r=0;r<t;r++){ input(a); input(b); add(c,a,b); cout << "Case " << ++case_cnt << ":" << endl; output(a); cout << " + "; output(b); cout << " = "; output(c); cout << endl << endl; } return 0; }
内容的提问来源于stack exchange,提问作者GavinCQTD
相关产品推荐
相关产品推荐

