友情提示:380元/半年,儿童学编程,就上码丁实验室。
宝爸之前有说过,软件的灵魂在于算法。那么,对于算法的最直观的变现,就是其驱动的各类设备的强大功能,即所谓的人工智能装置或者各种酷炫的显示效果,即所谓的虚拟现实仿真,以及其他能让普通人震撼的视觉或触觉上的感受。其实,这些都是内在的各种优秀的算法所驱动的。对于算法的研究,宝爸可以辛弃疾的用一句诗来贴切的形容:“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”
算法说明:
每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。
参考来源:
《CCF中学生计算机程序设计(基础篇)》P211的eg8.2_2,该书被大多数机构选择为信奥的学习教材。
Scratch实现代码:
首先,点击“绿旗”运行后,系统提示要求输入一个用于分解的数字,
回车确认后,软件将按照上述算法进行求解并输出求解结果。
其他语言的实现代码:
C#:
static
void
Main(
string
[] args)
{
Practice3();
}
private
static
void
Practice3()
{
List<
int
> a =
new
List<
int
>();
//用于存放质因数
Console.WriteLine(
"请输入一个整数:"
);
int
n = Convert.ToInt32(Console.ReadLine());
int
o = n;
//用于存放输入的整数
for
(
int
x = 2; x <= n; x++)
{
if
(n%x == 0)
{
n/=x;
a.Add(x);
x--;
//为了防止该整数有多个相同质因数最终只能输出一个的情况
}
}
Console.WriteLine(
"{0}={1}"
,o,
string
.Join(
"*"
,a.ToArray()));
}
Pascal:
Var
n :
Int64
;
i :
Longint
;
Begin
readln( n ) ;
if
n<>
1
then
write
( n ,
'='
)
else
write
( n ,
'=1'
);
i :=
2
;
while
n<>
1
do
Begin
if
( n
mod
i )=
0
then
Begin
n := n
div
i ;
write
( i );
if
n<>
1
then
write
(
'*'
);
i :=
2
;
End
else
inc( i ) ;
End
;
writeln
;
End
.
C:
#include <stdio.h>
#include <math.h>
int
main()
{
int
i,b;
long
long
int
in;
/*采用64位整型,以便输入更大的数*/
freopen
(
"F://1.txt"
,
"r"
,stdin);
freopen
(
"F://2.txt"
,
"w"
,stdout);
while
(
scanf
(
"%lld"
,&in)!=EOF)
{
/*在F://1.txt中输入x个数N(N>=2)以换行符或空格符隔开,当没有输入时循环会自动结束*/
b=0;
/*用于标记是否是第一个质因数,第一个质因数在输出时前面不需要加空格*/
for
(i=2;in!=1;i++)
{
if
(in%i==0)
{
in/=i;
b?
printf
(
"%d"
,i):
printf
(
"%d"
,i),b=1;
i--;
/*i--和i++使得i的值不变,即能把N含有的所有的当前质因数除尽,例如:24会一直把2除尽再去除3*/
}
printf
(
"n"
);
}
}
return
0;
}
C++:
//将一个数n分解为若干个从小到大排列的质数的积
#include <iostream>
using
namespace
std;
int
main()
{
int
n, n2;
cin >> n;
cout << n <<
"="
;
n2 = n;
if
(n<2)
return
0;
//小于2的数不合法,若n为质数则输出它本身
for
(
int
i = 2;i*i<=n2;i++)
//根号n复杂度
{
while
(n2%i==0)
{
n2=n2/i;
cout << i ;
if
(n2!=1)cout <<
"*"
;
}
}
if
(n2!=1) cout << n2;
//当n为质数
return
0;
}