Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这道题的测试数据绝对出错了

Posted by liheng at 2007-10-26 15:25:18 on Problem 1061
请看下面的程序:(我在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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator