R浩轩泽Anmicius @ 2021-04-22 17:29:31
原来的代码:
#pragma GCC opitimize(2)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
double a,b,num_a,num_b;
inline void read(int &x){
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+(ch^48);
ch=getchar();
}
x*=f;
}
int main(){
read(n);read(k);
for(int i=1;i<=n;++i)
(!(i%k))?++num_a,a+=i:++num_b,b+=i;
printf("%.1lf %.1lf",a/num_a,b/num_b);
return 0;
}
这样样例都过不了,果断放弃三目:
#pragma GCC opitimize(2)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
double a,b,num_a,num_b;
inline void read(int &x){
x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+(ch^48);
ch=getchar();
}
x*=f;
}
int main(){
read(n);read(k);
for(int i=1;i<=n;++i)
if(!(i%k))++num_a,a+=i;
else ++num_b,b+=i;
printf("%.1lf %.1lf",a/num_a,b/num_b);
return 0;
}
这样就A掉了
这三目和if有什么区别吗)
by _caiji_ @ 2021-04-22 17:32:54
?:
的优先级比 ,
低,所以
(!(i%k))?++num_a,a+=i:++num_b,b+=i;
实际上相当于
((!(i%k))?++num_a),(a+=i:++num_b),(b+=i);
至于怎么过的编译我不清楚
by _caiji_ @ 2021-04-22 17:39:58
具体什么运算顺序可以看这张表
by ud2_ @ 2021-04-22 17:58:54
@R浩轩泽Anmicius 运算符优先级的问题当然要画表达式树了。
你以为这个表达式会被解析成
?:
!(i % k)
,
++num_a
a += i
,
++num_b
b += i
实际上它是
,
?:
!(i % k)
,
++num_a
a += i
++num_b
b += i
by R浩轩泽Anmicius @ 2021-04-22 23:02:15
@caijianhong 谢谢您!!!
by R浩轩泽Anmicius @ 2021-04-22 23:02:38
@sjx233_ 谢谢谢谢