作者radar735 (◎*◎+◎)
看板b99902HW
标题Re: [作业] 计程单班Homework「Double palindrome」
时间Thu Sep 30 21:58:29 2010
各位资工系的强者好
我是外系旁听的
这次的作业我卡了很久所以来这里求救
如果这样有触犯板规
请版主不要劣退我 我会自D
以下是程式码:
#include <stdio.h>
int main(){
int a[100];
int c=0;//count
int m=0;//middle
int i,j;
int l=0;//length
int n=0;
int nn=0;
int lr[2][10000]={{0},{0}};
int maxlr[2][10000]={{0},{0}};
int ll=0;
int rr=0;
while(scanf("%d",&a[c])==1){
c++;
}//计算输入资料有几笔
//odd 计算如 12321 的单数回文
for(i=1;i<c;i++){
l=0;
for(j=1;((i-j)>=0)&&((i+j)<c);j++){
if(a[i-j]==a[i+j]){
m=i;
l++;
lr[0][n]=m-l;
lr[1][n]=m+l;
n++;
}else
break;
}
}
//even 计算如 123 321 的偶数回文
for(i=0;i<c;i++){
l=0;
for(j=0;(i-j)>=0&&(i+j+1)<c;j++){
if(a[i-j]==a[i+j+1]){
m=i;
l++;
lr[0][n]=m-l+1;
lr[1][n]=m+l;
n++;
}else
break;
}
} //每个数字自己也算回文 如 1
for(i=0;i<c;i++){
lr[0][n+i]=i;
lr[1][n+i]=i;
}
n+=c;
//找所有双回文的头尾
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(lr[1][i]+1==lr[0][j]){
maxlr[0][nn]=lr[0][i];
maxlr[1][nn]=lr[1][j];
nn++;
}
}
}
//由上一个for所得资料找到最长的双回文
for(i=0;i<nn;i++){
if(maxlr[1][i]-maxlr[0][i]>rr-ll){
ll=maxlr[0][i];
rr=maxlr[1][i];
}else if(((maxlr[1][i]-maxlr[0][i])==(rr-ll))&&(maxlr[0][i]>ll)==1){
ll=maxlr[0][i];
rr=maxlr[1][i];
}
}
for(i=ll;i<=rr;i++)
printf("%d ",a[i]);
}
这个程式只能得到7分
希望能有强者告诉我是哪里出了问题
另外因为单班强者们一定都跟这个程式奋战许久
相信一定看得懂我在写甚麽
如果因为我写得太没有条理看不懂
请推文告知我会补上
感谢强者们~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 119.77.199.111
1F:→ a13032002:当输入是 1 2 3 2 1 时,你的程式输出 1 2 3 2 1 09/30 22:46
2F:→ a13032002:依照题意,答案应该是 2 3 2 1 (?) 09/30 22:46
3F:推 math120908:68~72行应该是多余的(?) 然後以後最好PO一下想法XD" 09/30 23:23
4F:→ Frux:各行加个注解吧 你以後会很需要的XDDDDD 10/01 00:44
※ 编辑: radar735 来自: 119.77.199.111 (10/01 07:23)
5F:→ radar735:注解已补上 10/01 07:24
6F:→ radar735:非常感谢各位...我把68~72砍掉终於10分了 10/01 07:27