问题:哇,你得到了两件事:
所有进程的调用顺序。 所有进程执行的理想顺序。 现在,让我们通过一个例子来演示这一点。假设有3个进程,进程的调用顺序是:3 - 2 - 1。理想的顺序是:1 - 3 - 2,即进程号3只有在进程号1完成后才会执行;进程号2只有在进程号3执行完之后才会被执行。
迭代#1: 由于理想的顺序是首先执行进程#1,因此调用顺序发生了变化,即第一个元素必须被推到最后一个位置。改变元素的位置需要1个时间单位。新的调用顺序为:2 - 1 - 3。第 1 步所用时间:1。
迭代#2:由于理想的顺序是首先执行进程#1,因此必须再次更改调用顺序,即必须将第一个元素推到最后一个位置。新的调用顺序为:1 - 3 - 2。第 2 步所用时间:1。
迭代 #3:由于调用顺序的第一个元素与理想顺序相同,因此将执行该过程。它就会这样弹出来。第 3 步所用时间:1。
迭代#4:由于调用顺序的新第一个元素与理想顺序相同,因此将执行该过程。第 4 步所用时间:1。
迭代#5:由于调用顺序的最后一个元素与理想顺序相同,因此将执行该过程。第 5 步所用时间:1。
总时间:5 个单位。 S:执行一个进程需要1个单位时间。改变位置需要1个时间单位。
输入格式: 第一行数字N,表示进程数。第二行包含进程的调用顺序。第三行包含进程的理想顺序。
输出格式: 打印要执行的整个进程队列所花费的总时间。
约束:1<=N<=100
示例输入
3
3 2 1
1 3 2
示例输出
5
我想到的第一个方法是声明一个变量,并在每次交换后将其加一加 2,但是如果我们采用大小为 3 的数组,则只有两种可能性。因此我打印了这些,是的,这是一个在线法官的问题,没有语法错误,但在网站上它告诉我声明中有一些问题,我不知道该怎么办,我是编程新手有人可以建议一种适用于更大尺寸数组的新方法吗?
#include <stdio.h>
swap(a,b);
long long int a,b;
int main(void) {
long long int n,i;
long long int a[3],b[3];
scanf("%d",&n);
for(i=0;i<=2;i++)
{
scanf("%d",a[i]);
}
for(i=0;i<=2;i++)
{
scanf("%d",&b[i]);
}
if(a[i]=b[i])
{
printf("2");
}
while(a[i]!=b[i])
{
swap(b[0],b[2]);
swap(b[0],b[1]);
{
if(a[i]=b[i])
printf("5");
}
}
return 0;
}
swap(a,b){
long long int temp;
a=temp;
b=a;
temp=b;
return swap(a,b);
}
最佳答案
您的 swap()
函数存在多个问题:
1:它在函数最后一行通过 return swap(a,b);
调用自身。这将导致无限递归和堆栈溢出。
2:需要声明函数的返回类型。如果它需要两个long long
参数并且不返回任何内容,那么它应该声明如下:
void swap(long long a, long long b);
3:正如所写,该函数无论如何都不会产生任何效果。如果您想更改这些变量的值,您需要将指针传递给它们:
long long swap(long long *a, long long *b);
4:要将指针传递给此函数,请在参数前添加 &
前缀,如下所示:
swap(&b[0],&b[2]); /* NOT: swap(b[0],b[2]); */
5:swap()
函数中的操作顺序也是错误的。首先,您将无法挽回地丢失 a
的值,而不是将其存储起来以便将其分配给 b
。试试这个:
void swap(long long *a, long long *b) {
long long temp;
temp = *a;
*a = *b;
*b = temp;
}
<小时/>
注意:请了解如何正确设置代码格式。另外,请始终在启用警告的情况下编译开发代码(例如,将 -Wall -pedantic
添加到命令行)。这样做会引起您对大多数(如果不是全部)这些问题的注意,而不必在这里询问。
关于有人可以告诉我这有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40133350/