是一道简单的PAT上的题目:N个数求和 链接:https://www.patest.cn/contests/gplt/L1-009
但是遇到了一个困惑本人好几天的问题,
代码完全是用C语言写的,交代码的时候显示第三个用例错误,但是只要将预定义写成
但是遇到了一个困惑本人好几天的问题,
代码完全是用C语言写的,交代码的时候显示第三个用例错误,但是只要将预定义写成
#include<cstdlib>; #include<cstdio>; using namespce std;
就正确了。有人知道这是为什么吗?!求帮助!
代码如下:
//#include<cstdio> //#include<cstdlib> #include<stdio.h> #include<stdlib.h> #define ll long long //using namespace std; ll gcd(ll a, ll b)//最大公约数 { return a%b==0?b:gcd(b,a%b); } int main() { ll N,gfm,fzh,zs,fsfz;//公分母 分子和 整数 分数分子 ll fz[100000],fm[100000]; scanf("%lld",&N); for(int i=0;i<N;i++) { scanf("%lld/%lld",&fz[i],&fm[i]); } gfm = fm[0]; for(int i=1;i<N;i++)//求公分母 { gfm = gfm/gcd(fm[i],gfm)*fm[i]; } fzh = 0; for(int i=0;i<N;i++)//求分子和 { fzh += gfm/fm[i]*fz[i]; } zs = fzh/gfm;//整数部分 fsfz = abs(fzh%gfm);//分数部分的分子 if(fsfz==0) printf("%lld\n",zs); else { if(zs!=0) { printf("%lld ",zs); } if(fzh<0&&zs==0) printf("-"); printf("%lld/%lld\n",fsfz/gcd(fsfz,gfm),gfm/gcd(fsfz,gfm)); } return 0; }
解决方案
90
这个问题以前已经有人指出了(但是许多人都无视)。
C++标准中,cstdio声明的是
C++标准中,cstdio声明的是
namespace std { int abs ( int n); long int abs ( long int n); long long int abs (long long int n); }
而C语言标准的stdio.h中声明的只是int abs (int n)。
所以,假如不“包含cstdio并指定在std名空间中查找”的话,编译器只会通过stdio.h找到来自C语言的int ::abs (int n),而不是你想要的int long long int std::abs (long long int n)。
假如不使用using namespace std,而明确以std::abs(参数)的形式调用,编译器就不会在你只包含stdio.h的时候悄悄使用int ::abs (int n)。(这也是经典C++编程中不建议使用using namespace std的理由。)
10
更正一下:
abs是在<cstdlib>与<stdlib.h>中声明的。
abs是在<cstdlib>与<stdlib.h>中声明的。
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);