- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个程序应该计算 2^1+2^2 + ... + 2^10 的值:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <math.h>
#define N 10
// sommatoria per i che va da 1 a N di 2^i, ogni processo calcola un singolo valore
int main(int argc, char** argv)
{
pid_t figli[N];
unsigned int i;
int status;
int fd[N][2];
int msg1=0,msg2;
int risultato=0;
bool padre=true;
for(i=0;i<N && padre;i++)
{
pipe(fd[i]);
figli[i]=fork();
if(figli[i]<0)
{
fprintf(stderr,"Una fork ha fallito\n");
}
else if(figli[i]==0)
{
padre=false;
}
else
{
msg1=i+1;
write(fd[i][1],&msg1,sizeof(int));
}
}
if(!padre)
{
read(fd[i][0],&msg2,sizeof(int));
msg2=pow(2.0,msg2);
write(fd[i][1],&msg2,sizeof(int));
exit(0);
}
else
{
for(i=0;i<N;i++)
{
read(fd[i][0],&msg2,sizeof(int));
risultato+=msg2;
}
}
if(padre)
fprintf(stderr,"%d\n",risultato);
return 0;
}
但是当ie执行程序时,父进程打印55。为什么?
最佳答案
有趣的是,55 是从 1 到 10 的所有数字的总和:这应该会给您一个即时线索:
pipe() creates a pipe, a unidirectional data channel that can be used for interprocess communication. The array pipefd is used to return two file descriptors referring to the ends of the pipe. pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write end of the pipe.
请注意:单向。换句话说,padre 正在读回它写入的相同值(因此是 55)。
您通常为双向流量设置两个管道,每个方向一个。所以我将管道的数量增加了一倍,使用偶数的管道用于父子关系,使用奇数的管道用于另一个方向。
此外,您的 child 继续 padre 循环,而他们应该立即退出该循环,这样他们的值 i
是正确的。您确实有基于 padre
的循环导出但这发生在之后 i
已经改变。您可以在设置的位置中断 padre
错误或简单地 i--
在if(!padre)
位恢复 i
到这个 child 的正确值。我做了后者。
以下代码(带有显示更改内容的标记)工作正常:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <math.h>
#define N 10
int main(int argc, char** argv)
{
pid_t figli[N];
unsigned int i;
int status;
int fd[N*2][2]; // CHANGED: two unidirectional pipes
int msg1=0,msg2;
int risultato=0;
bool padre=true;
for(i=0;i<N && padre;i++)
{
pipe(fd[i*2]);
pipe(fd[i*2+1]); // ADDED: create second pipe
figli[i]=fork();
if(figli[i]<0)
{
fprintf(stderr,"Una fork ha fallito\n");
}
else if(figli[i]==0)
{
padre=false;
}
else
{
msg1=i+1;
write(fd[i*2][1],&msg1,sizeof(int)); // CHANGED: pipe number
}
}
if(!padre)
{
i--; // ADDED: to restore i for the child
read(fd[i*2][0],&msg2,sizeof(int)); // CHANGED: pipe number
msg2=pow(2.0,msg2);
write(fd[i*2+1][1],&msg2,sizeof(int)); // CHANGED: pipe number
exit(0);
}
else
{
for(i=0;i<N;i++)
{
read(fd[i*2+1][0],&msg2,sizeof(int)); // CHANGED: pipe number
risultato+=msg2;
}
}
if(padre)
fprintf(stderr,"%d\n",risultato);
return 0;
}
这会生成 2046 的正确答案,因为 2<sup>0</sup> + 2<sup>1</sup> + ... 2<sup>10</sup> = 2<sup>11</sup> - 1
并且,由于您遗漏了二到零项(等于 1):2<sup>1</sup> + 2<sup>2</sup> + ... 2<sup>10</sup> is 2<sup>11</sup> - 2 (2<sup>11</sup> = 2048)
.
关于计算 N 次幂之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989596/
我根据维基百科页面上指定的基本算法在 Haskell 中实现了二次筛。它适用于大多数整数,但它无法找到 n 次幂的数字 N 的因式分解。对于偶数次幂(平方),算法循环,对于奇数次幂,我找到了几个平方模
我必须多次提高 10 的两倍。 有没有比使用数学库 pow(10,double) 更有效的方法?如果重要的话,我的 double 总是在 -5 到 -11 之间为负数。 我假设 pow(double,
我想写一个函数来返回 2 的下一个幂。因此,如果输入是 18,它将返回 32,这是系列 2、4、8、16、32、64 中下一个大于 18 的数字 如果输入是 40,它将返回 64。 目前我正在使用以下
环境 Ubuntu 17.04,Chrome 60。 在没有警告/错误的情况下在本地运行此示例:https://github.com/mdn/webgl-examples/tree/gh-pages/
我有一个这样的数字序列: 1.687155E21 3.981457E19 0.5532155E21 3.018843E21 2.0532155E21 4.5532155E21 3.1637913E19
谁能告诉我一种方法来找到获得已知值所需的 2 的幂。例如,假设我需要找到 32 的 2 的幂。换句话说,如果我知道某个值,如何找到给出该值的 2 的幂。 if the given value is 6
我有两个值,一个是 X 的基数,一个是 N 的幂,如何才能得到 X 的 N 次幂 ans。 任何代码将不胜感激。 最佳答案 你正在寻找这个: https://api.dartlang.org/stab
我很难找到解决这个问题的方法。我正在尝试用Java开发一个程序,该程序将一个数字作为输入并打印每个数字的幂总和,使得第n位数字的幂是第(n-1)位数字。然而,对于第一位数字,功率应该是最后一位数字的功
我已经做到了这一点,但我不知道如何进一步进行 #include int main() { int x,n,m,i; printf("Enter the value of x: "); scanf("%
如果我有一个介于 100 和 1000 之间的数字,我想得到值 3,因为 10^3 = 1000。同样,如果我有一个介于 10 和 100 之间的数字,我想得到值 2,因为 10^2是 100。 如果
我必须编写一个程序来计算 2 的 2010 次方 的次方并求出数字的总和。例如: if `2 power 12 => gives 4096 . So 4+0+9+6 = 19 . 现在我需要为 2 p
我在最近的比赛中遇到了一个问题。 我无法找到解决方案,并且还没有针对该问题的社论。 Question Link 我在这里引用问题陈述也是为了以防链接不起作用。 找出大于或等于 A 且小于或等于 B (
我找不到用于计算 2^n 的 SSE 指令对于 vector __m128i 32 位整数。 是否有执行以下伪代码的指令或函数? __m128i power_of_two(__m128i b) {
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我是一名优秀的程序员,十分优秀!