同じ番号を確認するシェルスクリプトが正しく機能しません。

同じ番号を確認するシェルスクリプトが正しく機能しません。
echo "Enter A Number: "
read num
show=`expr $num`
flag=1
square=`expr $num \* $num`
while [ $num -gt 0 ]
do
        flag1=`expr $num % 10`
        flag2=`expr $square % 10`
        if [ $flag1 -ne $flag2 ]
        then
                flag=0
                break
        fi
        num=`expr $num / 10`
        square=`expr $num / 10`
done

if [ $flag -eq 0 ]
then
        echo $show "is NOT An Automorphic Number"
else
        echo $show "is An Automorphic Number"
fi

自動識別番号を確認するコードです。デフォルトでは、この数字は四角形の末尾に表示されます。 625年末に25個が残ったようです。

入力5でのみ動作します。 25、76などでは動作しません。私はどこで間違っていますか?

答え1

私は算術が好きではないので、計算を実行するサンプルプログラムをbash書いています。awk

{len=length($1);
pow=$1 * $1; 
div= 10^len; 
if ($1 == pow % div) print $1 " is An Automorphic Number"; 
else print $1  " is not An Automorphic Number"}

入力番号の長さにのみ興味を持ち、それに応じて設定します。私のテストは次のとおりです。

[ ~]$ echo 1 |awk '{len=length($1);pow=$1 * $1; div= 10^len; if ($1 == pow % div) print $1 " is An Automorphic Number"; else print $1  " is not An Automorphic Number"}'
1 is An Automorphic Number
[ ~]$ echo 5 |awk '{len=length($1);pow=$1 * $1; div= 10^len; if ($1 == pow % div) print $1 " is An Automorphic Number"; else print $1  " is not An Automorphic Number"}'
5 is An Automorphic Number
[ ~]$ echo 76 |awk '{len=length($1);pow=$1 * $1; div= 10^len; if ($1 == pow % div) print $1 " is An Automorphic Number"; else print $1  " is not An Automorphic Number"}'
76 is An Automorphic Number

答え2

長すぎます。

次の数字を印刷することをお勧めしますはい自己防衛:

$ printf '%s\n' 11 5 25 625 76 111 12890625>infile

$ awk '{s=$0^2; r=$0"$"};s~r'  infile

5
25
625
76
12890625

またはより秘密の形で:

$ awk '$0^2 ~ $0"$"' infile

または各番号に明確な回答が必要な場合:

$ awk '{out=" NOT "} $0^2 ~ $0"$" {out=" "} {printf "%20s %s%s",$0,"is"out"An Automorphic Number",ORS}' infile
                  11 is NOT An Automorphic Number
                   5 is An Automorphic Number
                  25 is An Automorphic Number
                 625 is An Automorphic Number
                  76 is An Automorphic Number
                 111 is NOT An Automorphic Number
            12890625 is An Automorphic Number

以前のソリューション。

四角形の尾部がn数字と一致することを確認することもできます。

#!/bin/bash

n=${1:-625}
square=$((n * n))
[[ $square =~ $n$ ]] && itis="" || itis="NOT"
echo "$n is $itis An Automorphic Number"

スクリプト情報

スクリプトにはいくつかの問題があります。

  • 通常、非常に古い拡張の代わりに算術拡張を使用する必要がありますexpr

  • 入力番号をスクリプトの引数として定義する方が簡単です。

  • 変更はsquare次のとおりですsquare。square = $((square / 10))。あなたが所有したものではありませんsquare=$((num/10))

いくつか変更すると、スクリプトは次のようになります。

#!/bin/bash

n=${1:-625}

flag=1
square=$((n * n))
num=$n
echo "Testing =$num= and square =$square="
while [ $num -gt 0 ]
do
        flag1=$(($num % 10))
        flag2=$(($square % 10))
    echo "Testing +$num+ with +$square+ that generate =$flag1= and =$flag2="
        if [ $flag1 -ne $flag2 ]
        then
                flag=0
                break
        fi
        num=$((num / 10))
        square=$((square / 10))
done

if [ $flag -eq 0 ]
then
        echo "$n is NOT An Automorphic Number"
else
        echo "$n is An Automorphic Number"
fi

次のように呼び出すことができます。

$ ./script 625
625 is An Automorphic Number

$ ./script 76
76 is An Automorphic Number

$ ./script 111
111 is NOT An Automorphic Number

関連情報