标题:[求助]为什么这是个死循环
只看楼主
袋鼠
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2005-7-19
 问题点数:0 回复次数:6 
[求助]为什么这是个死循环

题目如下:
(ACM浙江大学网上的练习题,原版是英文的)
Let { A1,A2,...,An } be a permutation of the set{ 1,2,..., n}. If i < j and Ai > Aj then the pair (Ai,Aj) is called an "inversion" of the permutation. For example, the permutation {3, 1, 4, 2} has three inversions: (3,1), (3,2) and (4,2).
The inversion table B1,B2,...,Bn of the permutation { A1,A2,...,An } is obtained by letting Bj be the number of elements to the left of j that are greater than j. (In other words, Bj is the number of inversions whose second component is j.) For example, the permutation:
{ 5,9,1,8,2,6,4,7,3 }
has the inversion table
2 3 6 4 0 2 2 1 0
since there are 2 numbers, 5 and 9, to the left of 1; 3 numbers, 5, 9 and 8, to the left of 2; etc.
Perhaps the most important fact about inversions is Marshall Hall's observation that an inversion table uniquely determines the corresponding permutation. So your task is to convert a permutation to its inversion table, or vise versa, to convert from an inversion table to the corresponding permutation.

Input:
The input consists of several test cases. Each test case contains two lines.
The first line contains a single integer N ( 1 <= N <= 50) which indicates the number of elements in the permutation/invertion table.
The second line begins with a single charactor either 'P', meaning that the next N integers form a permutation, or 'I', meaning that the next N integers form an inversion table.
Following are N integers, separated by spaces. The input is terminated by a line contains N=0.

Output:
For each case of the input output a line of intergers, seperated by a single space (no space at the end of the line). If the input is a permutation, your output will be the corresponding inversion table; if the input is an inversion table, your output will be the corresponding permutation.

Sample Input:
9
P 5 9 1 8 2 6 4 7 3
9
I 2 3 6 4 0 2 2 1 0
0
Sample Output:
2 3 6 4 0 2 2 1 0
5 9 1 8 2 6 4 7 3

我的程序如下:
问题:编译、连接都通过,运行时输入两行数据后没有反应,经检查是因为程序中红字部分是死循环,这是为什么?
#include <iostream>
using namespace std;

// 函数声明, fun_p 用于处理输入为p的情况,fun_i 用于处理输入为i 的情况
void fun_p (int, int *);
void fun_i (int, int *);

int main ()
{
int arry[50];
int N;
char tmp;

cin>>N;

while (N > 0)
{
cin>>tmp;
for (int i = 0;i < N;i++)
{
cin>>arry[i];
}

switch (tmp)
{
case 'p':
case 'P': fun_p (N, arry); break;
case 'i':
case 'I': fun_i (N, arry); break;
default: cout<<"Error!"<<endl;
}

cin>>N;
}

return 0;
}

void fun_p (int N, int *p)
{
int p_arry[50];

for (int i = 1;i <= N;i++)
{
int count = 0;
for (int j = 0;j < N;j++) // 这是个死循环,为什么??
{
while (*(p+j) != i && *(p+j) > i)
{
count++;
}
}
p_arry[i-1] = count;
}

for (i = 0;i < N;i++)
{
cout<<p_arry[i]<<" ";
}
cout<<endl;
}

// void fun_i 函数定义先不写了
void fun_i (int N, int *p)
{
}

[此贴子已经被作者于2005-11-22 13:55:47编辑过]

搜索更多相关主题的帖子: 浙江大学 英文 elements obtained example 
2005-11-22 13:41
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
得分:0 
while (*(p+j) != i && *(p+j) > i)

这个条件一直成立?


成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2005-11-22 14:07
袋鼠
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2005-7-19
得分:0 

不会的,
while (*(p+j) != i && *(p+j) > i)
是在for循环语句
for (int j = 0;j < N;j++)中的,这个for循环语句是有结束条件的呀


爱编程,爱生活
2005-11-22 15:20
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
得分:0 
但是你在while里面不会出来了啊。也就走不了for了阿

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2005-11-22 15:33
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
搞清if与while

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-11-22 15:39
袋鼠
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2005-7-19
得分:0 
噢,顿悟顿悟,呵呵,原来是一时糊涂了,多谢了

爱编程,爱生活
2005-11-22 16:32
袋鼠
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2005-7-19
得分:0 
完善一下,原来红字for循环部分应该改成这样:
int flg = 0;
for (int j = 0;j < N;j++)
{

if (*(p+j) != i && *(p+j) > i && flg == 0)
{
count++;
}
else if ( *(p+j) == i)
{
flg = 1;
}
}

爱编程,爱生活
2005-11-22 16:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-34639-1-1.html




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

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