最新消息:

【算法讲解】Scartch数学算法1之–分解质因数算法

Scratch 少儿编程 3302浏览 0评论

友情提示:视频教程观看时请手动设置清晰度。

宝爸之前有说过,软件的灵魂在于算法。那么,对于算法的最直观的变现,就是其驱动的各类设备的强大功能,即所谓的人工智能装置或者各种酷炫的显示效果,即所谓的虚拟现实仿真,以及其他能让普通人震撼的视觉或触觉上的感受。其实,这些都是内在的各种优秀的算法所驱动的。对于算法的研究,宝爸可以辛弃疾的用一句诗来贴切的形容:“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

算法说明:

每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。

参考来源:

《CCF中学生计算机程序设计(基础篇)》P211的eg8.2_2,该书被大多数机构选择为信奥的学习教材。

Scratch实现代码:

【算法讲解】Scartch数学算法1之--分解质因数算法

首先,点击“绿旗”运行后,系统提示要求输入一个用于分解的数字,

【算法讲解】Scartch数学算法1之--分解质因数算法

回车确认后,软件将按照上述算法进行求解并输出求解结果。

【算法讲解】Scartch数学算法1之--分解质因数算法

其他语言的实现代码:

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;
}

 

您必须 登录 才能发表评论!