杭电1036 wronganswer

以下是能通过的代码但是有一个地方改过就不能通过了。。。具体我在下方注释出来了#include<stdio.h>#include<string.h>doubleM;intj... 以下是能通过的代码 但是 有一个地方 改过就不能通过了。。。具体我在下方注释出来了

#include<stdio.h>
#include<string.h>
double M;
int jinzhi[3]={3600,60,1},N,T;
char time[21][9];
int main()
{
scanf("%d %lf",&N,&M);
while(scanf("%d",&T)!=EOF)
{
memset(time,0,sizeof(time));
int i,j,len,avg_secon,secon=0,t=0;
bool flag=true;
for(i=0;i<N;i++)
scanf("%s",time[i]);
for(i=0;i<N;i++)
{
t=0;
len=strlen(time[i]);
for(j=0;j<len;j++)
{
if(time[i][j]==':'){t++;continue;}
if(time[i][j]=='-'){flag=false;break;}
if(j+1<len&&time[i][j+1]==':'){secon+=(time[i][j]-'0')*jinzhi[t];continue;}
if(j+1<len&&time[i][j+1]!=':')
{
secon+=((time[i][j]-'0')*10+(time[i][j+1]-'0'))*jinzhi[t];
j++;// 此处合并为secon+=((time[i][j]-'0')*10+(time[i][++j]-'0'))*jinzhi[t]; 就不能通过了
continue; //两种方式不是应该一样的么? 理解不了了 请大神指点一下
}

}
if(!flag)break;
}
if(!flag){printf("%3d: -\n",T);continue;}
avg_secon=(int)((double)secon/M+0.5);//四舍五入
printf("%3d: %d:%02d min/km\n",T,avg_secon/60,avg_secon%60);
}
return 0;
}
展开
 我来答
金色潜鸟
2014-09-26 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5546万
展开全部
[++j] 是 前缀加加,表达式里,j 要先增1,再使用,出了表达式,j 不再增1。

式 子 里 你 若既有 t[j], 又有 t[++j]; 那么 程序 实际上 分 2 步走:
(1)j=j+1;
(2) t[++j] 里的 j 用了 新的 j;
t[j] 里的 j 也用了 新的 j; -- 这就不是你想要的结果。前缀加加的副作用!
---
用简单例子来洞悉这个问题:
int t[]={2,4,6,8,10};
int s=0,j=1;
s = t[j]+t[++j];
printf("s=%d t[j]=%d",s,t[j]);

原来想要的 是 t[1]+t[2] = 4 + 6 = 10;
程序 却 用 了 t[2]+t[2] = 6 + 6 =12; 输出的 s 是 12,不是想要的 10。
追问

我试过了 输出的S 确实是10的

追答
要用MS VC++ 6.0 编译器,默认优化选项。得 s=12 t[j]=6
不同的编译器 和优化选项 影响结果的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式