동일한 번호를 확인하는 쉘 스크립트가 제대로 작동하지 않습니다.

동일한 번호를 확인하는 쉘 스크립트가 제대로 작동하지 않습니다.
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

관련 정보