C语言问题,某杭电ACM题目,调试没问题,不过运行出错,一步步观察发现在strcpy那里卡住了...求高手..
题目ProblemDescriptionEddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3....
题目
Problem Description
Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n。这也是最初的牌的顺序。通过一次洗牌可以把牌的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。那么可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。编程对于小于100000的自然数N,求出M的值。
Input
每行一个整数N
Output
输出与之对应的M
Sample Input
20
1
Sample Output
20
2
我写的代码
#include<stdio.h>
#include<string.h>
main()
{
char a[100000],e[100000];
int b,i,j,c;
while(scanf("%d",&b)!=EOF)
{
for(i=0;i<2*b;i++)
{
a[i]=i;
}
strcpy(a,e);
while(!strcmp(a,e))
{
for(j=0;j<b;j++)
{
a[j]=a[b-1]+a[j];
a[b-1]=a[j]-a[b-1];
a[j]=a[j]-a[b-1];
}
c++;
}
printf("%d",--c);
}
}
错误的都地方请改过来,谢谢...题目源地址http://acm.hdu.edu.cn/showproblem.php?pid=1210 展开
Problem Description
Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n。这也是最初的牌的顺序。通过一次洗牌可以把牌的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。那么可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。编程对于小于100000的自然数N,求出M的值。
Input
每行一个整数N
Output
输出与之对应的M
Sample Input
20
1
Sample Output
20
2
我写的代码
#include<stdio.h>
#include<string.h>
main()
{
char a[100000],e[100000];
int b,i,j,c;
while(scanf("%d",&b)!=EOF)
{
for(i=0;i<2*b;i++)
{
a[i]=i;
}
strcpy(a,e);
while(!strcmp(a,e))
{
for(j=0;j<b;j++)
{
a[j]=a[b-1]+a[j];
a[b-1]=a[j]-a[b-1];
a[j]=a[j]-a[b-1];
}
c++;
}
printf("%d",--c);
}
}
错误的都地方请改过来,谢谢...题目源地址http://acm.hdu.edu.cn/showproblem.php?pid=1210 展开
2个回答
展开全部
char型数组建议不要赋值为0;建议改为a[i]=i+1,不过在本题中关系不大;
字符串没写满的话~~后面的值是随机值的~~用strcmp函数不大稳吧~~建议自制比较函数;
另外我感觉你交换值的方法有点费劲~~干嘛不直接操作指针间接修改;
strcmp(e,a)
for(int i=0;i<b;i++)
e[2*i]=a[i];
for(int i=0;j<b;j++)
e[2*i-1]=a[b+i];
另外我没注意你的交换对象居然写错了~题的本意不是a[j]和a[b-1]交换吧
如果按你的写~应该是这样
for(j=0;j<2b;j++)
a[j]=a[j]+a[2*j%(2*b+1)];
a[2*j%(2*b+1)]=a[j]-a[2*j%(2*b+1)];
a[j]=a[j]-a[2*j%(2*b+1)];
字符串没写满的话~~后面的值是随机值的~~用strcmp函数不大稳吧~~建议自制比较函数;
另外我感觉你交换值的方法有点费劲~~干嘛不直接操作指针间接修改;
strcmp(e,a)
for(int i=0;i<b;i++)
e[2*i]=a[i];
for(int i=0;j<b;j++)
e[2*i-1]=a[b+i];
另外我没注意你的交换对象居然写错了~题的本意不是a[j]和a[b-1]交换吧
如果按你的写~应该是这样
for(j=0;j<2b;j++)
a[j]=a[j]+a[2*j%(2*b+1)];
a[2*j%(2*b+1)]=a[j]-a[2*j%(2*b+1)];
a[j]=a[j]-a[2*j%(2*b+1)];
追问
咋发现我strcpy那里 把a数组 也改了。。我是一步步 调试发现的,后面交换那里的确是错了现在改成 a[j]=a[b+j-1]+a[j];
a[b+j-1]=a[j]-a[b+j-1];
a[j]=a[j]-a[b+j-1];
追答
"咋发现我strcpy那里 把a数组 也改了。。"
是你把strcpy用错了吧~~~保险的形式是把a放在2b+1长度的新申请的数组里,每项用const设置为只读,作为原字符数组.然后修改e每项的值~再比较;
关于你的置换~建议多学学数学~~或者你写完这项式子把数据代进去试试不就完了吗?又错了~~;现在还在学校吧?建议打好基础~~再往高处够.
展开全部
strcpy 的定义原型是 extern char *strcpy(char *dest,char *src);
即第一个参数指定拷贝目的地, 第二个参数指定拷贝源, 你写反了
即第一个参数指定拷贝目的地, 第二个参数指定拷贝源, 你写反了
更多追问追答
追问
是写反了 不过还是不行..一步步看的话..只有a[0]复制到了e[0],还有前面定义c的时候应该多个c=0;这个我看出来了...
追答
strcpy 是以遇到字符串结尾 (ASCII 的 0, 0x0) 来作为拷贝终止的条件的, 而你一开始把 a[0] 赋为 0, 就表示字符串到这里就结束了, 如果需要拷贝这样的二进制串, 推荐用 memcpy
这里其实还有很多问题, 比如 char a[i] 最大只能存到 255, 你那样弄的话, 只能处理输入 N 小于 128 的情况
这个题最后应该是推公式的, 你可以先模拟找下规律
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询