是一道简单的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);