但是遇到了一个困惑鄙人好几天的问题,
代码完全是用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;
}
18 个解决方案
#1
你的意思是用C语言是错的,改成C++是对的?
#2
对,但是c++必须加上using这行才对
#3
可能用c编译的时候变量声明的问题,c语言的变量声明都全部要声明在前面。但是for循环里有int i;我觉得可能是这个问题
#4
c++引入命令名间就是为了防止名字冲突,所以标准库中定义的函数都在std命令空间之内,
如果要使用xxx函数,则写using std::xxx;
写成using namespace std;会引入std内的所有名字。
#5
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
#6
可能用c编译的时候变量声明的问题,c语言的变量声明都全部要声明在前面。但是for循环里有int i;我觉得可能是这个问题
刚试了下,不是这个问题
#7
你的意思是用C语言是错的,改成C++是对的?
对,但是c++必须加上using这行才对
c++引入命令名间就是为了防止名字冲突,所以标准库中定义的函数都在std命令空间之内,
如果要使用xxx函数,则写using std::xxx;
写成using namespace std;会引入std内的所有名字。
我用的不是自己定义的gcd函数吗?
#8
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
那用c交的话怎样改才正确
#9
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
那用c交的话怎样改才正确
C都不存在cstdio这种头文件,你当然只能#include <stdio.h>
而且C没有命名空间的概念,所以你直接用printf, scanf就好了
#10
如果你真的百思了 我认为你还是能找到答案的。另外,建议把把C和C++当成两门语言来学,目前随着C++的拓展,差异越来越大了。
#11
如果你真的百思了 我认为你还是能找到答案的。另外,建议把把C和C++当成两门语言来学,目前随着C++的拓展,差异越来越大了。
我是个初学者,自己思考量有限,就是到处找答案找了好久了
#12
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
那用c交的话怎样改才正确
C都不存在cstdio这种头文件,你当然只能#include <stdio.h>
而且C没有命名空间的概念,所以你直接用printf, scanf就好了
我的问题就是,用c的这些东西显示一个用例错误,只有使用了c++的那些头文件和using才正确
#13
大家可以照着我说的去上面链接交一下试试,用c的预定义交c,c++的交c++,神奇的地方就是只要改成c++那套预定义就会正确了,
#14
这个问题以前已经有人指出了(但是许多人都无视)。
C++标准中,cstdio声明的是
所以,如果不“包含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的理由。)
C++标准中,cstdio声明的是
namespace std {而 C语言标准的stdio.h中声明的只是int abs (int n)。
int abs ( int n);
long int abs ( long int n);
long long int abs (long long 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的理由。)
#15
这个问题以前已经有人指出了(但是许多人都无视)。
C++标准中,cstdio声明的是namespace std {而 C语言标准的stdio.h中声明的只是int abs (int n)。
int abs ( int n);
long int abs ( long int n);
long long int abs (long long 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的理由。)
那c语言就没法交对这个代码了吗
#16
更正一下:
abs是在<cstdlib>与<stdlib.h>中声明的。
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);
abs是在<cstdlib>与<stdlib.h>中声明的。
那c语言就没法交对这个代码了吗
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);
#17
更正一下:
abs是在<cstdlib>与<stdlib.h>中声明的。 那c语言就没法交对这个代码了吗
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);
还是不理解哎,我想知道这个代码怎么改,然后再从中领悟为什么
#18
懂了懂了!谢谢14楼大神 正解
#1
你的意思是用C语言是错的,改成C++是对的?
#2
你的意思是用C语言是错的,改成C++是对的?
对,但是c++必须加上using这行才对
#3
可能用c编译的时候变量声明的问题,c语言的变量声明都全部要声明在前面。但是for循环里有int i;我觉得可能是这个问题
#4
你的意思是用C语言是错的,改成C++是对的?
对,但是c++必须加上using这行才对
c++引入命令名间就是为了防止名字冲突,所以标准库中定义的函数都在std命令空间之内,
如果要使用xxx函数,则写using std::xxx;
写成using namespace std;会引入std内的所有名字。
#5
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
#6
可能用c编译的时候变量声明的问题,c语言的变量声明都全部要声明在前面。但是for循环里有int i;我觉得可能是这个问题
刚试了下,不是这个问题
#7
你的意思是用C语言是错的,改成C++是对的?
对,但是c++必须加上using这行才对
c++引入命令名间就是为了防止名字冲突,所以标准库中定义的函数都在std命令空间之内,
如果要使用xxx函数,则写using std::xxx;
写成using namespace std;会引入std内的所有名字。
我用的不是自己定义的gcd函数吗?
#8
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
那用c交的话怎样改才正确
#9
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
那用c交的话怎样改才正确
C都不存在cstdio这种头文件,你当然只能#include <stdio.h>
而且C没有命名空间的概念,所以你直接用printf, scanf就好了
#10
如果你真的百思了 我认为你还是能找到答案的。另外,建议把把C和C++当成两门语言来学,目前随着C++的拓展,差异越来越大了。
#11
如果你真的百思了 我认为你还是能找到答案的。另外,建议把把C和C++当成两门语言来学,目前随着C++的拓展,差异越来越大了。
我是个初学者,自己思考量有限,就是到处找答案找了好久了
#12
C++是有命名空间的概念的!头文件cstdio和stdio.h是不一样的!其他类似头文件同理。
cstdio会将符号导入到std命名空间,只是在某些平台上才会导入到全局命名空间,比如微软的VS。
所以如果你用这个,需要写std::printf, std::scanf才行,或者先导入,用using std::printf;,或者直接导入所有用using namespace std;
stdio.h的话则将符号直接导入到全局命名空间里。
理论上你要写::printf的,但是一般你不会自己定义一个printf,所以就算你直接写printf也会是stdio.h的那个printf
那用c交的话怎样改才正确
C都不存在cstdio这种头文件,你当然只能#include <stdio.h>
而且C没有命名空间的概念,所以你直接用printf, scanf就好了
我的问题就是,用c的这些东西显示一个用例错误,只有使用了c++的那些头文件和using才正确
#13
大家可以照着我说的去上面链接交一下试试,用c的预定义交c,c++的交c++,神奇的地方就是只要改成c++那套预定义就会正确了,
#14
这个问题以前已经有人指出了(但是许多人都无视)。
C++标准中,cstdio声明的是
所以,如果不“包含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的理由。)
C++标准中,cstdio声明的是
namespace std {而 C语言标准的stdio.h中声明的只是int abs (int n)。
int abs ( int n);
long int abs ( long int n);
long long int abs (long long 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的理由。)
#15
这个问题以前已经有人指出了(但是许多人都无视)。
C++标准中,cstdio声明的是namespace std {而 C语言标准的stdio.h中声明的只是int abs (int n)。
int abs ( int n);
long int abs ( long int n);
long long int abs (long long 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的理由。)
那c语言就没法交对这个代码了吗
#16
更正一下:
abs是在<cstdlib>与<stdlib.h>中声明的。
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);
abs是在<cstdlib>与<stdlib.h>中声明的。
那c语言就没法交对这个代码了吗
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);
#17
更正一下:
abs是在<cstdlib>与<stdlib.h>中声明的。 那c语言就没法交对这个代码了吗
C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);
还是不理解哎,我想知道这个代码怎么改,然后再从中领悟为什么
#18
懂了懂了!谢谢14楼大神 正解