LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 541|回复: 1

请帮我,一道程序题!!!

[复制链接]
发表于 2005-3-22 23:29:13 | 显示全部楼层 |阅读模式
一个朋友报了软考,看的一份试卷上有下题,我们两都没看懂,请哪位高手帮忙详细解释一下,不胜感激!!!



阅读下列函数说明和C代码,将应填入其中止处的字句,写在答卷的对应栏内。
[程序说明)
设有两个整型数组a[]和b[],其中数组a[]的前n个元素中按序存放着0,1,2,----,
n-l。现要求按数组a[]为序号重新调整数组b[]的前n个元素的存储顺序,便调整后的
b存放着调整前的b[a]。程序在调整时不使用工作数组。
如a[]={5,0,6,3,2,1,4}  b[]{3,7,20,5,8,12,6}
则调整后b[]={12,3,6,5,20,7,8}
由于a[]中存储的是数列0,1,2,---,n-l的一个排列,则a[]中的值可分成满足以下
性质的若干组,某组的m个元素il.i2,i3,---,im有如下关系:a[il]=i2,a[i2]=i3,a[i3]
=i4,---,a[im]=i1。
数组a[]的这组值的意义是使数组b[]的元素b[il],b[i2],---,b[im]构成一个传递
环:
b[il]<-b[i2],b[i3]<-b[i3],---,b[im]<-b[il]
为了区别一个元素是否已处理过,程序中给它一个增量n,待全部完成后,再清除设置
的标记;
[程序]
#include<stdio&#8226;h>
inta[]={5,0,6,3,2,1,4};
intb[]={3,7,20,5,8,12,6};
void main()
{int i,j,aj,head,n;
n=sizeof(a)/sizeof(a[0]);
for(i=0;i<=n-l;i++)
{if(a>=nll(____)
continue;_____;
j=i;
aj=a[j];
while_____
{_______;
_______;
j=aj;
aj=a[j];
}
b[j]=head;
a[j]+=n;
}
for(i=0;i<n;i++)
if(a>=n)  a-=n;
for(i=0;i<n;i++)
printf("%4d",b);
printf("\n");
}
发表于 2005-3-23 11:17:18 | 显示全部楼层
#include<stdio.h>
int a[]={5,0,6,3,2,1,4};
int b[]={3,7,20,5,8,12,6};
void main()
{
        int i,j,aj,head,n;
        n=sizeof(a)/sizeof(a[0]);
        for(i=0;i<=n-1;i++)
        {
                if(a>=n ||/*____*/a == i)
                        continue;
                /*_____*/head = b;
                j=i;
                aj=a[j];
                while(/*_____*/aj != i)
                {
                        /*_______*/a[j] += n;
                        /*_______*/b[j] = b[aj];
                        j=aj;
                        aj=a[j];
                }
                b[j]=head;
                a[j]+=n;
        }
        for(i=0;i<n;i++)
                if(a>=n) a -=n;
        for(i=0;i<n;i++)
                printf("%4d",b);
        printf("\n");
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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