鱼C论坛

 找回密码
 立即注册
查看: 2775|回复: 16

一个很纠结的问题

[复制链接]
发表于 2012-6-25 12:24:25 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 8375899 于 2012-6-25 12:24 编辑

#include<stdio.h>
void main()
{
int i,k,m,n,num[50],*p;
printf("input number of person:n=");
scanf("%d",&n);
p = num;
for(i=0; i< n; i++)
{
     *(p+i) = i+1 ;
}
i =0;
k =0;
m =0;
while(m< n-1)
{
  if(*(p+1)!=0) k++;
  if(k==3)
  {
     k=0;
  m++;
  }
  i++;
  if(i==n) i=0;
}
  while(*p ==0) p++;
  printf("The last one is No.%d\n",*p);
}题目 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号人的那个人。
位什么 我的结果总是1。。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-25 13:10:39 | 显示全部楼层
请问  while(*p ==0) p++;是什么意思p是一个指针变量,p++是一个地址偏移
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 13:25:56 | 显示全部楼层
你的算法很混乱哦!!!!最后的printf("The last one is No.%d\n",*p);指针p本来就是只指向数组第一个元素的,你这里输出的是第一个元素的值p[0],那肯定必定输出的是1......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 13:30:46 | 显示全部楼层
:Q而且您这个算法逻辑不对吧!!!!!这个队伍即使有10人,凡是报到3的都退出队伍,那肯定最后是后面的8个人先退出退伍的,剩下来的是前两个人!!!!!!!:L
你如果是循环队列的话,也没指明那个是头那个是尾部
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-25 13:59:42 | 显示全部楼层
它是围城一圈的,while(*p ==0) p++;
当报3时 编号置为0
最后筛选不为0的输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-25 14:13:07 | 显示全部楼层
我把程序重新注释下
#include<stdio.h>
void main()
{
int i,k,m,n,num[50],*p;
printf("input number of person:n=");
scanf("%d",&n);
p = num;
for(i=0; i< n; i++)
{
     *(p+i) = i+1 ; /*以1至n编序给每个人编号*/
}
i =0;           /*i为每个循环时计数变量*/            
k =0;           /*k为按1,2,3报数时的计数变量*/
m =0;           /*m为退出人数*/
while(m< n-1)   /*当退出的数比n-1少时(即未退出人数大于1时)执行循环体*/
{
  if(*(p+1)!=0) k++;
  if(k==3)
  {
     k=0;       /*对退出的编号置0*/
  m++;
  }
  i++;
  if(i==n) i=0; /*报数到尾后,i恢复为0*/
}
  while(*p ==0) p++;
  printf("The last one is No.%d\n",*p);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 15:26:12 | 显示全部楼层
算法有问题,while循环中p一直是指向第一个的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 16:18:09 | 显示全部楼层
楼上不对,楼主最后输出的就已经有问题了,*p永远输出的都是数组第一个元素!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-25 16:20:24 | 显示全部楼层
将while(m< n-1)   /*当退出的数比n-1少时(即未退出人数大于1时)执行循环体*/
{
  if(*(p+i)!=0) k++;
  if(k==3)
  {
     *(p+i)=0;
     k=0;       /*对退出的编号置0*/
  m++;
  }
  i++;
j将源程序 的while 代码改成这样

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 16:22:22 | 显示全部楼层

while(*p ==0) p++;
  printf("The last one is No.%d\n",*p);

其它逻辑我自己看觉得莫名其妙的....不过先抛开其它的逻辑不看,单看最后这里句已经有致命的错误了....P保存的是数组第一个元素的地址,怎么可能能自加呢,自加是地址的自加...没任何的意义

  printf("The last one is No.%d\n",*p);输出的永远只会是数组第一个元素的地址,因为p本来保存的就是数组第一个元素的地址,而输出*p那肯定是只会输出第一个元素的值来了.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-25 16:28:05 | 显示全部楼层
本帖最后由 8375899 于 2012-6-25 16:29 编辑

哥哥p++ 相当于 p=p+1;好不 它的意思是 当p地址即首地址 因为前面有代码将p =num;
的值 *p等于0 指针往后推 变成p+1 即p+1的地址赋给p地址,p是地址变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-25 16:32:55 | 显示全部楼层
修改后的完整代码
#include<stdio.h>
void main()
{
int i,k,m,n,num[50],*p;
printf("input number of person:n=");
scanf("%d",&n);
p = num;
for(i=0; i< n; i++)
{
     *(p+i) = i+1 ; /*以1至n编序给每个人编号*/
}
i =0;           /*i为每个循环时计数变量*/            
k =0;           /*k为按1,2,3报数时的计数变量*/
m =0;           /*m为退出人数*/
while(m< n-1)   /*当退出的数比n-1少时(即未退出人数大于1时)执行循环体*/
{
  if(*(p+i)!=0) k++;
  if(k==3)
  {
         *(p+i)=0;
     k=0;       /*对退出的编号置0*/
     m++;
  }
  i++;
  if(i==n) i=0; /*报数到尾后,i恢复为0*/
}
  while(*p ==0) p++;
  printf("The last one is No.%d\n",*p);
}
你可以自己编译运行下 输入8 结果是7

1 2 3 4 5 6 7 8 编号
1 2 0 1 2 0 1 2 报数,且报3的置0
0 1 0 2 0 0 1 2  
0 0 0 1 0 0 2 0
0 0 0 0 0 0 1 0 最后只剩下编号7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 20:12:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 20:27:18 | 显示全部楼层
p++是地址的偏移吧......数组的元素偏移应该是*p,  *(p+1) , *(p+2).......*(p+n)
相当于数组的p[0],p[1],p[2]......p[n]

能直接p++的么???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-25 20:51:57 | 显示全部楼层
本帖最后由 8375899 于 2012-6-25 20:56 编辑

晕死,p=num; 第7行代码 就定义了 未曾改变。
一个地址存储的元素是固定的 p++偏移地址将 p+1的地址赋给p这时 p的地址就是p+1的地址 同时其元素*p也应该是p+1的元素 即此时*p=*(p+1),判断 此时*p是否等于0 若等于0 继续偏移 由于地址是连续的,此时的p+1的地址相当于 最开始的p+2的地址 以后依次类推。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-25 22:41:14 | 显示全部楼层
:(这算法意义何在???哥...这用循环链表多好求呀...用数组看您算法有点看糊涂了,有点不好理解....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-26 02:51:53 | 显示全部楼层
直接用数组就好了呀·······退出的那个人填0,最后就可以知道是几号了···{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表