| ||||||||||
| 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