首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用shell脚本得到所有奇数到n的乘积

如何使用shell脚本得到所有奇数到n的乘积
EN

Stack Overflow用户
提问于 2021-02-16 21:47:08
回答 3查看 66关注 0票数 1

我试着把所有奇数的乘积都求到n,但输出总是0。

代码语言:javascript
复制
read -p "Enter a number: " n

prod=0

for((k=1; k<=n; k++))
do
    if [ k%1==0 ]
    then
        prod=$((prod*=k))
    fi
done

echo "Product of odd counting numbers until $n is $prod"
EN

回答 3

Stack Overflow用户

发布于 2021-02-17 01:34:39

对于这个任务,模运算是多余的。只需使用增量为2的C风格的for循环:

代码语言:javascript
复制
#!/bin/bash

read -p "Enter a number: " n
prod=1
for ((k = 3; k <= n; k += 2)); do ((prod *= k)); done
echo "Product of odd counting numbers until $n is $prod"

请注意,产品很容易溢出。例如,在64位系统上,当n等于或大于35时。如果您想要获得更大的n的正确结果,您可能需要使用bc实用程序:

代码语言:javascript
复制
#!/bin/bash

read -p "Enter a number: " n
prod=1
for ((k = 3; k <= n; k += 2)); do prod+="*$k"; done
printf "Product of odd counting numbers until %d is " "$n"
bc <<< "$prod"

请注意,在此上下文中,prod+="*$k"是字符串连接,而不是算术操作。

票数 2
EN

Stack Overflow用户

发布于 2021-02-16 22:10:01

任何算术表达式都需要在$((..))中因此:

代码语言:javascript
复制
read -p "Enter a number: " n
prod=0
for((k=1; k<=n; k++))
do 
  if [[ "$((k%1))" == "0" ]]
  then
    prod=$((prod*=k))
  fi
done
echo "Product of odd counting numbers until $n is $prod"
票数 0
EN

Stack Overflow用户

发布于 2021-02-16 22:14:09

四个问题:

  • [ k%1==0 ]表示“字符串k%1==0是否是非空的?”它一直都是,所以这将永远是正确的。

代码语言:javascript
复制
- You need blanks around the operator, and `==` is only allowed in Bash, but not Posix compliant.
- `k%1` is just a string; you need an arithmetic context to do math.

总而言之,这将是

如果$((k%1)) =0;则

但是可以在Bash中替换为

if ((k%1 == 0));则

  • 有一个逻辑错误:要确定一个数是否为奇数,你必须检查它是否为模2;模1始终为0:

如果((k%2 == 1));则

,可以缩写为

如果((k%2);则

因为((...))中的非零结果是真的

  • prod=$((prod*=k))有一个冗余的赋值:您可以使用

((prod *= k))

在它自己的上

  • 您必须从prod=1开始,否则它将始终保持为0

合并,修复所有ShellCheck投诉:

代码语言:javascript
复制
#!/usr/bin/env bash

read -rp "Enter a number: " n
prod=1

for ((k = 1; k <= n; ++k)); do
    ((k % 2)) && ((prod *= k))
done

echo "Product of odd counting numbers until $n is $prod"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66225571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档