依然是不懂奇妙的"O2优化"

P1055 [NOIP2008 普及组] ISBN 号码

dreamlike @ 2023-02-10 02:15:02

想问问各位大神开启O2优化和不开启的区别是什么?不开启优化的话1,4,7爆红,开启后就没问题了,代码如下:


#include<stdio.h>
int main(){
    int a,b,c,d,g,h,i,j,k,z,x,y;
    char m;
    scanf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%c",&a,&b,&c,&d,&g,&h,&i,&j,&k,&z);
    x=a*1+b*2+c*3+d*4+g*5+h*6+i*7+j*8+k*9;
    y=x%11;
    if(y==10&&z!='X'){
        m='X';
        printf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%c",a,b,c,d,g,h,i,j,k,m);
        }    
    else if(z-48==y||y==z-78)
        printf("Right");
    else
        printf("%1d-%1d%1d%1d-%1d%1d%1d%1d%1d-%1d",a,b,c,d,g,h,i,j,k,y);
    return 0;
}

by ud2_ @ 2023-02-10 02:17:35

出现这种情况一般是代码写错了。这里的错误是尝试用 %c 读入 int 类型的变量 z


by Eleveslaine @ 2023-02-10 06:28:08

@dreamlike 开o2可以提升程序运行速度

例如邻接矩阵的 O(n^3) floyd,不开o2 能过 n=750,开o2能过 n=1000

但是也有些程序不能开o2,称为厌氧程序,例如你的程序。


by BeBanned @ 2023-02-10 07:33:38

@Franz_Liszt 它的代码不是厌氧程序吧。。。他不是说02才能过么。。。


by Coffins @ 2023-02-10 07:36:31

@Franz_Liszt 他这个是程序有问题罢,开了才A掉


by cancan123456 @ 2023-02-10 08:56:39

是有未定义行为,这时有没有 O2 会影响结果


by Eleveslaine @ 2023-02-10 20:04:06

咳咳,看错了。


by dreamlike @ 2023-02-10 23:05:15

@ud2_ 一开始有考虑这个问题,但换成%d也报错,看题解也没有思路,可以问问有无方法改掉这个错误么


by dreamlike @ 2023-02-10 23:06:01

@Franz_Liszt 虽然但是,谢谢你的科普!!!


by dreamlike @ 2023-02-10 23:07:45

@cancan123456 请问定义出错也就是不匹配,也是属于未定义行为么


by ud2_ @ 2023-02-10 23:17:31

@dreamlike 把 z 的类型换成 char

既然要输入的是 一个字符,那么 %c(对应的类型是 char)最为合适。%d 没法解析输入数据中可能出现的 X。


| 下一页