Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这道题的测试数据绝对出错了请看下面的程序:(我在Baidu上搜索到的) #include <stdio.h> int main() { unsigned long x,y,m,n,l; scanf("%ld %ld %ld %ld %ld",&x,&y,&m,&n,&l); if(m==n) printf("Impossible\n"); else{ if(m>n){ m=m-n; x=(y-x+l)%l; } else{ m=n-m; x=(x-y+l)%l; } //把其中移动比较慢的那个当做不动。 n=x/m; x=x%m; y=x; // 用相对运动的思想。 while(1){ if(y==0){ printf("%ld\n",n); break; } // 当两个人的距离等于零时 n=n+(y+l)/m; y=(y+l)%m; if(y==x){ printf("Impossible\n"); break; } //当两个人的距离又回到原来的距离表示不可能 } } return 0; } 这段代码AC了。 但是如何你把 if(m>n){ m=m-n; x=(y-x+l)%l; } else{ m=n-m; x=(x-y+l)%l; } 复制到自己的程序中还是出错,有人讲123 45 456 345 56是得22还是得46的问题,其实应该是22的,因为以上的程序申请的是unsigned long型的,所以在计算x=(y-x+l)%l;时与申请__int64不一样,如果123 45 456 345 56用unsigned long执行x=(y-x+l)%l;后x=10,如果是__int64执行x=(y-x+l)%l;后x=-22. 分析如下: y-x+l = -22 转化为unsigned long 为4294967274,4294967274%56=10 这就是为什么题目的测试数据出错的原因。 小弟是新手,不知道分析得对不对。 跪求大牛指教,如果有时间请发邮件给我,谢谢 liheng@nlsde.buaa.edu.cn Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator