杭电oj平台上的11页题目代码:hdu-page11 (2030~2039)(2035、2036)

//2030
//思路:汉字机内码使用二个字节,汉字的每个字节都是<0的,
#include<stdio.h>
#include<string.h>
#define N 1001
char str[N];
int main()
{
int n;
int count;
int len;
scanf("%d", &n);
getchar();
while (n--)
{
gets(str);
count = 0;
len = strlen(str);
for (int i = 0; i < len; i++)
{
if (str[i]<0)
{
count++;
}
}
printf("%d ", count/2);
}

return 0;
}

//2031
#include<stdio.h>
#include<string.h>
#define N 1001
int str[N];//用来存储r进制数
int main()
{
int n;
int r;
int count;
int temp;
while (~scanf("%d%d",&n,&r))
{
count = 0;
temp = 0;
//将负数转换为正数
if (n<0)
{
n = -n;
printf("-");
}
while (n)
{
temp = n%r;
str[count++] = temp;
n /= r;
}
//从后往前输出
for (int i = count-1; i >= 0; i--)
{
if (str[i]>=0&&str[i]<=9)
{
printf("%d", str[i]);
}
else
{
str[i] = str[i] - 10 + 'A';//存储其对应的ascii码
printf("%c", str[i]);//输出相应的ascii码对应的字母
}
}
printf(" ");
}
return 0;
}

//2032
#include<stdio.h>
#include<string.h>
#define N 31
int r[N][N];
int main()
{
int n;
int i, j;
for ( i = 1; i < 31; i++)
{
r[i][1] = 1;
r[i][i] = 1;
}
for ( i = 3; i < 31; i++)
{
for (j = 2; j < i; j++)
{
r[i][j] = r[i - 1][j] + r[i - 1][j - 1];
}
}
while (~scanf("%d",&n))
{
for ( i = 1; i <= n; i++)
{
for ( j = 1; j <= i; j++)
{
if (j-1)
{
printf(" ");
}
printf("%d", r[i][j]);
}
printf(" ");
}
printf(" ");
}
return 0;
}

//2033
#include<stdio.h>
#include<string.h>
#define N 31
int r[N][N];
int main()
{
int n;
scanf("%d", &n);
int hh1, mm1, ss1;
int hh2, mm2, ss2;
int hh, mm, ss;
while (n--)
{
scanf("%d%d%d", &hh1, &mm1, &ss1);
scanf("%d%d%d", &hh2, &mm2, &ss2);
hh = 0;
mm = 0;
ss = 0;
ss = ss1 + ss2;
if (ss>59)
{
mm+=1;
ss -= 60;
}
mm = mm+mm1 + mm2;
if (mm>59)
{
hh += 1;
mm -= 60;
}
hh = hh+hh1 + hh2;
printf("%d %d %d ", hh, mm, ss);
}
return 0;
}

//2034
#include<iostream>
#include<algorithm>
#define N 101
int a[N];
int b[N];
using namespace std;
int main()
{
int n, m;
int i, j;
int len;//用来记录交集中元素的个数
while (cin>>n>>m)
{
len = 0;
if (n==0&&m==0)
{
break;
}
for ( i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
for ( j = 0; j < m; j++)
{
cin >> b[j];
}
sort(b, b + m);
for ( i = 0; i < n; i++)
{
for ( j = 0; j < m; j++)
{
if (a[i] == b[j])
{
len++;
a[i] = -1;//标记了相等的数
}
}
}
if (len==n)
{
cout << "NULL" << endl;
}
else
{
for ( i = 0; i < n; i++)
{
if (a[i] >= 0)
cout << a[i] <<' ';
}
cout << endl;
}

}
return 0;
}

//2035
//快速幂
#include<iostream>
#include<algorithm>
#define N 101
int a[N];
int b[N];
using namespace std;
int mod_pow(int x, int n, int mod)
{
int res = 1;
while (n>0)
{
//n&1等效于 n%2==1
if (n & 1)
res = res*x%mod;
x = x*x%mod;
n >>= 1;//右移一位
}
return res;
}

int main()
{
int m, n;
while (~scanf("%d%d",&m,&n))
{
if (m == 0 && n == 0)
{
break;
}
printf("%d ", mod_pow(m, n, 1000));
}
return 0;
}

//2036
/*思路:原理是在平面上取(0,0)来分割多边形为多个三角形,然后用叉乘来求三角形的面积(有向)再求和。这样的话可以把凸N多边形转化为N个三角形,然后求解N个三角形即可,输入顶点的顺序。无论是顺时针还是逆时针均可。
题目要求:计算多边形面积

* 方法:把n多边形分割成n - 2个三角形,分别求和,然后相加

* 注意:分割的所有三角形有一个公共的顶点,这里选择0点位公共点

* 注:题中给出的点的顺序为逆时

* 叉乘的性质:设两向量P和Q

* 1.P ×Q > 0 则Q在P的逆时针方向

* 2.P ×Q < 0 则Q在P的顺时针方向

* 3.P ×Q = 0 则Q和P共线,方向可能相同也可能不相同*/
#include<iostream>
#include<algorithm>
#define N 101
using namespace std;
typedef struct point
{
int x, y;
}point;
point a[N];
double area(point p,point q)
{
return p.x*q.y - q.x * p.y;
}

int main()
{
int n;
int i;
int j;
double sum;
while (cin>>n)
{
sum = 0;
if (n==0)
{
break;
}
for ( i = 0; i < n; i++)
{
scanf("%d%d", &a[i].x, &a[i].y);
}
//将其分割成多个三角形
for ( i = 0; i < n; i++)
{
j = (i + 1) % n;//
sum += area(a[i], a[j]);
}
sum /= 2;
if (sum<0)
{
sum = -sum;
}
printf("%.1lf ", sum);
}
return 0;
}

//2037
//思路:贪心
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100

struct node{
int start;
int end;
}record[MAXN];

bool cmp(const node&a, const node&b)
{
return a.end < b.end;
}
int main()
{
int n;
int i;
int count;
int lastend;
while (cin>>n)
{
if (n==0)
{
break;
}
for ( i = 0; i < n; i++)
{
cin >> record[i].start >> record[i].end;
}
sort(record, record + n, cmp);
count = 1;
lastend = record[0].end;
for ( i = 0; i < n; i++)
{
//贪心法处理:后一个起始时间必须大于或等于前一个终止时间
if (record[i].start>=lastend)
{
count++;
lastend = record[i].end;
}

}
cout << count << endl;
}
return 0;
}

//2039
//思路:判断是不是一个三角形的思路是任意两边之和是否大于第三边
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100
int main()
{
int m;
cin >> m;
double a, b, c;
while (m--)
{
cin >> a >> b >> c;
if (a+b>c&&b+c>a&&a+c>b)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}

}
return 0;
}

一生有所追!
原文地址:https://www.cnblogs.com/BlueBlue-Sky/p/8577324.html