关于程序设计中“求余”运算的思考

(整期优先)网络出版时间:2021-06-21
/ 2

关于程序设计中“求余”运算的思考

周芝君

南京邮电大学 管理学院


摘 要:算术运算是一种很重要的运算,在问题求解中具有很广泛的应用。求余运算作为一种算术运算,在算术问题求解中经常会遇到。本文对求余运算在解决具体问题时如何合理使用进行探索与思考,对求余运算应用于正整数数位分割、正整数素数判断、正整数完数判断以及两正整数的最大公约数求解等问题进行细致分析,结合求余运算的用法,对具体问题进行求解,运用 C 语言与 Python 语言加以编程实现,揭示求余运算对实际问题求解的重要性。关键词:求余运算;问题求解;C 语言;Python 语言


一、求余运算

对于计算机高级编程语言,一般都会提供求余运算。求余运算作为一种算术运算符,有着很广泛的应用。C 语言中提供的求余运算,是针对两个整数进行的运算,也就是说求余运算的左右操作数都必须是整型,求余运算的运算符号为%。本文讨论求余运算在 C 语言和Python 语言中的应用问题。

二、问题求解

1、正整数数位分割问题

60d00d20e4e41_html_39e4affb10c50357.gif
60d00d20e4e41_html_39e4affb10c50357.gif

C 语言:

#include

void main()

{ long int a; scanf(“%ld”, &a); while(a)

{ printf(“%d”, a%10);

a=a/10;

}

}

Python 语言:

if name == ' main ': a = int(input(''))

while a:

print(a % 10) a = a // 10

如何从一个正整数中分割出每一个数位上的数字,是一个有趣的问题。我们可以从低位开始利用求余运算符号进行处理。例如:正整数 a, 它的个位上的数字便是 a%10。若需要从低位到高位求其它数位上的数字,可以采用求余运算与整除运算相结合,借助循环结构处理。实现按从小到大输出每个数位上的数的实现程序如图 1 所示:


图 1: 正整数的数位分割实现程序


2、正整数素数判断问题

根据素数的定义,一个正整数若为素数,则它的因子除了 1 和它本身外,没有其它因子。故判断一个正整数 a 是否为素数,需要在区间[2, a-1]间寻找因子,若找到,则不是素数,否则为素数。实现素数判断程序如图 2 所示:


C 语言:

#include

void main()

{ long int i,a; scanf(“%ld”, &a); for(i=2;i<=a-1;i++)

if(a%i==0) break; If(i>a-1)

printf(“%ld 是素数”, a);

else

printf(“%ld 不是素数”, a);

}

Python 语言:

If name ==' main ' : a = int(input(''))

i=0

for i in range(2,a): if a%i == 0:

break

i+=1

if i>a-1:

print(str(a)+'是素数。')

60d00d20e4e41_html_7bc0709f09d1382a.gif60d00d20e4e41_html_a9ff0ce6920381d9.gif


图 2: 正整数的素数判断实现程序

3、正整数完数判断问题

60d00d20e4e41_html_58da23b68f8f27c7.gif
60d00d20e4e41_html_bf84bf19fe9c06b3.gif

C 语言:

#include

void main()

{ long int i,a,sum=0; scanf(“%ld”, &a); for(i=1;i<=a-1;i++)

if(a%i==0) sum=sum+i; If(sum==a)

printf(“%ld 是完数”, a);

else

printf(“%ld 不是完数”, a);

}

Python 语言:

if name == ' main ' : a =int(input(''))

i=0 sum=0

for i in range(1,a): if a%i == 0:

sum=sum+i if sum == a:

print(str(a) + ' 是完数') else:

print(str(a) +‘不是完数')

完数是一类很特殊的数字,它的所有因子(除它本身)之和等于它本身。一个正整数是否为完数,首先需要寻找它的所有因子,然后求和,再判断与其是否相等。判断完数的程序如图 3 所示:

图 3:正整数的完数判断实现程序4、两正整数最大公约数问题

两个正整数的最大公约数,是两个正整数的最大公共因子,即寻找一个被两正整数都能整除的最大整数。一般方法即逐步下降寻找因子法,如图 4-1 所示:


C 语 言 : #include void main()

{ long int i,a,b; scanf(“%ld%ld”, &a, &b);

for(i=a;i>=1;i--) if(a%i==0&&b%i==0) break;

printf(“%ld 与%ld 的最大公约数是%ld”, a,b,i);

}

Python 语言:

if name ==' main ': a = int(input(''))

b =int(input('')) i=0

for i in range(a, 0, -1): print(i)

if a % i==0 and b % i==0: break

print(str(a)+' 和'+str(b)+' 的最大公约数是' +str(i))

60d00d20e4e41_html_2a0752922dc16250.gif60d00d20e4e41_html_631b7307fe4c965e.gif

图 4-1:逐步下降寻找因子法实现程序

60d00d20e4e41_html_386eb1c2c59e9cfe.gif
60d00d20e4e41_html_12a6da418a4b92fd.gif

C 语言:

#include

void main()

{ long int a,b,c,x,y;

scanf(“%ld%ld”, &a, &b); x=a;

y=b;

c=a%b;

while(c!=0)

{ a=b; b=c; c=a%b;

}

printf(“%ld 与%ld 的最大公约数是%ld”, x,y,b);

}

Python 语言:

if name ==' main ': a = int(input(''))

b =int(input('')) c=a%b

x=a y=b

while c!=0:

a=b b =c

c=a%b

print(str(x) + ' 和 ' + str(y) + ' 的最大公约数是' + str(b))

还有一种经典的方法,能有效降低循环次数,缩短程序执行时间。这种方法称之为“辗转相除法”,是一种循环迭代方法。辗转相除法实现程序如图 4-2 所示:

图 4-2:辗转相除法实现程序


三、总结

求余运算是很常见的一种运算,应用十分广泛。本文对求余运算在寻找正整数因子的简单应用进行了分析与 C 语言与 Python 语言程序实现。一般涉及到寻找因子或判断整除的问题,都会涉及到求余运算。掌握对求余运算的应用具有很重要的意义。


参考文献:

  1. 谭浩强. C 程序设计(第 4 版). 北京: 清华大学出版社, 2010.

  2. 刘高军, 何丽. C 程序设计竞赛实训教程.北京: 机械工业出版社, 2012. [4]董付国, Python 程序设计(第 2 版). 北京: 清华大学出版社, 2020.