1020 Big Integer
http://soj.sysu.edu.cn/1020
题目:给定大整数x(400个字符以内),求x对b1,b2,..,bn的模。
思路:12345678901234567890 % m
= ( ( 1 % m * 10 + 2 ) % m*10+3 ) % m …
代码:
int div(char x[], int b) {
int r = 0;
for (int i=0; x[i]!='\0'; i++) {
r = (r*10 + x[i]-'0') % b;
}
return r;
}
int main()
{
// 1020 Big Integer
int t, n, i;
scanf("%d",&t);
while (t--) {
scanf("%d",&n);
int b[maxn];
for (i=0; i<n; i++)
scanf("%d",&b[i]);
char x[maxm];
scanf("%s",x);
int len = strlen(x);
printf("(%d",div(x,b[0]));
for (i=1; i<n; i++)
printf(",%d",div(x, b[i]));
printf(")\n");
}
return 0;
}
1021 Couple
http://soj.sysu.edu.cn/1021
题目:1~N排成一列,若相邻两个为夫妻,则可消去,判断最终能否全部消去。
思路:将每对夫妻视作不同的括号,利用stack进行括号匹配。
代码:
// 1021 Couple
int n;
while (scanf("%d",&n)==1 && n>0)
{
int couple[maxn];
int a, b;
for (int i=0; i<n; i++) {
scanf("%d%d",&a, &b);
couple[a] = b;
couple[b] = a;
}
int i=1;
stack<int> s;
for (i=1; i<=2*n; i++) {
if (!s.empty() && s.top()==couple[i])
s.pop();
else
s.push(i);
}
if(s.empty())
printf("Yes\n");
else
printf("No\n");
}
1156 Binary Tree
http://soj.sysu.edu.cn/1156
题目:输入每个节点的id、内容、左右子树的id,输出这棵树的前序遍历。
思路:dfs
代码:
// 先序遍历
void dfs(int root, int left[], int right[], char c[])
{
printf("%c",c[root]);
if (left[root]!=0)
dfs(left[root], left, right, c);
if (right[root]!=0)
dfs(right[root], left, right, c);
return;
}
int main()
{
int n, root;
bool id[maxn];
int p[maxn], left[maxn], right[maxn];
char content[maxn];
while(scanf("%d",&n)!=EOF)
{
// 初始化:没有一个id出现过,所有id的parent为-1
for (int i=1; i<maxn; i++){
id[i] = false;
p[i] = -1;
}
// 输入id为val,内容为content[val],左右孩子为left[val]和right[val]
// 记左右孩子的parent为val
int val;
for (int i=0; i<n; i++) {
scanf("%d",&val);
id[val] = true;
//scanf("%s",&content[val]);
content[val] = getchar();
content[val] = getchar();
scanf("%d%d",&left[val],&right[val]);
p[left[val]] = p[right[val]] = val;
}
// 寻找根节点的id
root = 0;
for (int i=1; i<maxn; i++)
if (id[i] && p[i]==-1) {
root = i;
break;
}
// 从根节点开始dfs
dfs(root, left, right, content);
printf("\n");
}
return 0;
}