| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7501 人关注过本帖
标题:[讨论]第八次编程题目,谢谢大家的支持.
只看楼主 加入收藏
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
斑竹写的不错

2007-03-20 11:38
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
以下是引用nuciewth在2007-3-19 23:53:03的发言:

我的数组定义的是10 你输入那么多 当然会出现错了
哎呀还有
输入范例:
{[(<>)]}
{}
<(>)
<()>

返回:
true
true
false
false
开始你要是在加个[]{} true 就好了 如果是这样我用判断回文的方法肯定是不行的
不过我还有1个算法:前面还是把ASCII码放在数组里,然后给数组一些测试的障碍 第一个障碍是测试括号是否对配的 第二个是测试 括号的优先级的,如果在测试过程中数组有一个没有通过直接用printf("false"),exit(0);来结束程序
如果程序能够运行到最后那就输出printf("true");
中午时间紧 没有时间写了。


羊肉串 葡萄干 哈密瓜!!
2007-03-20 12:34
oooccc1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-21
收藏
得分:0 
第一题使用一个堆栈,复杂度为O(n)
第二题则可以利用质因数与约数的关系,复杂度最差O(n),平均为O(log n)
(比方36的所有约数和则,由于36=(2^2)*(3^2)
所有约数和=(1+2+2^2)*(1+3+3^2)=91,求余可以在计算过程中实现)
这个计算方法利用到了数论的基本知识,似乎是个公式...不过不记得了...

2007-03-21 00:41
oooccc1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-21
收藏
得分:0 
#include <stdio.h>
#define MAX 100
int main()
{
int suc,i,top;
char a[100];
char stack[MAX];
while (scanf("%s",a)&&a[0]!='#')
{
top=0;suc=1;
for (i=0;suc&&a[i];i++)
{
if (a[i]=='<'||a[i]=='{'||a[i]=='['||a[i]=='(') stack[top++]=a[i];
else
{
if (a[i]=='>'&&stack[top-1]!='<') suc=0;
if (a[i]=='}'&&stack[top-1]!='{') suc=0;
if (a[i]==']'&&stack[top-1]!='[') suc=0;
if (a[i]==')'&&stack[top-1]!='(') suc=0;
top--;
}
}
if (suc&&top==0) printf("true\n");
else printf("false\n");
}
return 0;
}

写了个精简版的,有用到一点点堆栈,在c-free编译通过,
简单测试后没有什么问题,大家帮着找找错吧,大家交流交流一起进步么,呵呵

[此贴子已经被作者于2007-3-21 0:57:40编辑过]

2007-03-21 00:54
oooccc1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-21
收藏
得分:0 
补上,我的那个输入以'#'开头的字符串会结束
2007-03-21 00:58
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 

不用看 绝对有错


羊肉串 葡萄干 哈密瓜!!
2007-03-21 03:12
oooccc1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-21
收藏
得分:0 

原来有优先次序,修改中....

[此贴子已经被作者于2007-3-21 12:50:31编辑过]

2007-03-21 12:48
oooccc1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-21
收藏
得分:0 
#include <stdio.h>
#define MAX 100
int check (char *stack,int top,char n)
{
char &m=stack[top-1];
if (m=='<') return 0;
else if (m=='('&&n!='<') return 0;
else if (m=='['&&n!='<'&&n!='(') return 0;
else if (m=='{'&&n=='{') return 0;
else return 1;
}
int main()
{
int suc,i,top;
char a[MAX];
char stack[MAX];
while (scanf("%s",a)&&a[0]!='#')
{
top=0;suc=1;
for (i=0;suc&&a[i];i++)
{
if (a[i]=='<'||a[i]=='{'||a[i]=='['||a[i]=='(')
{
if (check(stack,top,a[i])) stack[top++]=a[i];
else suc=0;
}
else
{
if (a[i]=='>'&&stack[top-1]!='<') suc=0;
if (a[i]=='}'&&stack[top-1]!='{') suc=0;
if (a[i]==']'&&stack[top-1]!='[') suc=0;
if (a[i]==')'&&stack[top-1]!='(') suc=0;
top--;
}
}
if (suc&&top==0) printf("true\n");
else printf("false\n");
}
return 0;
}
加了检查嵌套顺序后,果然长长了,呵呵,这下应该可以了

[此贴子已经被作者于2007-3-21 12:59:03编辑过]

2007-03-21 12:56
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
同级可以嵌套 {{}} 。。。。。
你先自己测试以下在发上来
{{}}
{[][]}
{[(<>)]}
<{}>

羊肉串 葡萄干 哈密瓜!!
2007-03-21 18:40
oooccc1
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-3-21
收藏
得分:0 
int check (char *stack,int top,char n)
{
char &m=stack[top-1];
if (m=='<'&&n!='<') return 0;
else if (m=='('&&n!='<'&&n!='(') return 0;
else if (m=='['&&n=='{') return 0;
else return 1;
}
这样吧
2007-03-21 23:27
快速回复:[讨论]第八次编程题目,谢谢大家的支持.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040035 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved