hdu 2116(判断是否溢出)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2116

题目大意就是给你两个k位数,然后相加,判断是否溢出。

思路:如果一正一负,那肯定不会溢出,其他情况就都转化为二进制来做,只要判断最后结果的位数就行了。

View Code
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int main(){
 7     int k;
 8     while(~scanf("%d",&k)){
 9         __int64 n,m;
10         scanf("%I64d%I64d",&n,&m);
11         if((n<0&&m>=0)||(n>=0&&m<0)){
12             printf("WaHaHa\n");
13             continue;
14         }
15         int tag=0;
16         if(n<=0&&m<=0){
17             n=-1*n;
18             m=-1*m;
19             tag=1;
20         }
21         string s1="",s2="",s3="";
22         int i,j,c=0,l=0;
23         while(n){
24             s1+=n%2+'0';
25             n/=2;
26         }
27         while(m){
28             s2+=m%2+'0';
29             m/=2;
30         }
31         for(i=0,j=0;i<s1.size()&&j<s2.size();i++,j++){
32             l=(c+(s1[i]-'0'+s2[j]-'0'))%2;
33             s3+=l+'0';
34             c=(c+s1[i]-'0'+s2[j]-'0')/2;
35         }
36         while(i<s1.size()){
37             l=(c+(s1[i]-'0'))%2;
38             s3+=l+'0';
39             c=(c+s1[i++]-'0')/2;
40         }
41         while(j<s2.size()){
42             l=(c+(s2[j]-'0'))%2;
43             s3+=l+'0';
44             c=(c+s2[j++]-'0')/2;
45         }
46         if(c)s3+=c+'0';
47         reverse(s3.begin(),s3.end());
48         if(tag&&s3.size()==k){
49             //如果都是负数的话,当相加刚好位k位时,那么最小是最高位为1,其余都是0,否则就会溢出;
50             //比如(-15)+(-1)=10000,此时k为5,表示-16.
51             for(i=1;i<s3.size();i++){
52                 if(s3[i]=='1'){
53                     printf("Yes\n");
54                     break;
55                 }
56             }
57             if(i==s3.size())printf("WaHaHa\n");
58         }else if(s3.size()+1<=k){
59             printf("WaHaHa\n");
60         }else 
61             printf("Yes\n");
62     }
63     return 0;
64 }

 

HDU(Hangzhou Dianzi University)OJ 中经常涉及到几何计算的问题,其中“判断两条线段是否相交”是一个经典的算法问题。以下是关于如何判断两线段是否相交的基本思路及其实现步骤: ### 判断两条线段相交的核心思想 可以利用向量叉积以及端点位置的关系来确定两条线段是否相交。 #### 具体步骤: 1. **定义基本概念** - 假设两条线段分别为 `AB` 和 `CD`。 - 使用二维平面中的坐标表示各顶点:A(x₁,y₁), B(x₂,y₂),C(x₃,y₃) ,D(x₄,y₄)。 2. **叉积的作用** 叉积可以帮助我们了解两点相对于一条直线的位置关系。 对于三个点 P、Q、R ,我们可以用叉乘 `(Q-P)x(R-P)` 来检测 R 是否在 QP 直线的一侧还是另一侧。 如果结果为正数,则表明顺时针;如果负则逆时针;若等于0则共线。 3. **快速排斥实验** 首先做一个矩形包围盒测试——即检查两个线段所在的最小外接矩形是否有重叠区域。如果没有重叠直接判定为不相交。 4. **跨立试验 (Cross-over Test)** 确认每个线段的两端分别位于另一个线段两侧即可认为它们交叉了。这通过上述提到过的叉积运算完成。 5. **特殊情况处理** 包含但不限于如下的几种情况需要单独讨论: - 完全重合的部分; - 存在一个公共端点但并不完全穿过等边缘状况。 6. **代码框架示例(Pseudo code):** ```python def cross_product(p1,p2,p3): return (p2[0]-p1[0])*(p3[1]-p1[1])-(p2[1]-p1[1])*(p3[0]-p1[0]) def on_segment(p,q,r): if ((q[0] <= max(p[0], r[0])) and (q[0] >= min(p[0], r[0])) and (q[1] <= max(p[1], r[1])) and (q[1] >= min(p[1], r[1]))): return True; return False; def do_segments_intersect(A,B,C,D): # 计算四个方向的叉积值 o1 = cross_product(A, C, B) o2 = cross_product(A, D, B) o3 = cross_product(C, A, D) o4 = cross_product(C, B, D) # 标准情况判断 if(o1 !=o2 && o3!=o4): return True # 特殊情况逐一验证... ``` 7. 最终结合所有条件得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值