分解素因子

一、题目描述

即要求我们将用户输入的一些数字,用多个素数的乘积来显示出来,并将它们由从小到大的顺序排列。其中,输入的第一个数字表示:需要分解几个数字(个数需在1~10之内)。然后再输入相应个数的数字(这些数字为正整数)。输出的结果即为:该数的一些素数因子的乘积,并从小到大排列。

二、源代码奉上

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<math.h>

int Su(int i)
    {
        int j = 0;
        for (j = 2; j <= sqrt(i); j++)
        {
            if (i % j == 0)
                return 0;
        }
        return 1;
    }//求素因子函数

int main()
{
    int k = 0;//个数
    long int arr1[10] = { 0 };
    int i = 0;//arr1下标
agian:
    printf("请输入需要分解的个数:");
    scanf("%d", &k);
    if (k <= 0 || k > 10)
    {
        printf("请输入1~10之间的数\n");
        goto agian;
    }
    else
    {
        for (i = 0; i < k; i++)
        {
            scanf("%d", &arr1[i]);
        }
    }
    //输入

    int n = 0;//素数的个数
    long int arr2[10000] = { 0 };
    int a = 0;//arr2下标
    int j = 0;//素数
    for (i = 0;i < k; i++)
    {    
        for (j = 2; j <= arr1[i]; j++)
        {
            if (1 == Su(j))
            {
                arr2[a] = j;
                a++;
                n++;
            }
        }//存素数
        int c = 0;//重新标记arr2下标
        for (int d = 0; d < n; d++)
        {
            if(arr1[i] % arr2[c] == 0)
            {
                arr1[i] = arr1[i] / arr2[c];
                printf("%d*", arr2[c]);    
            }
            else if (arr1[i] % arr2[c] != 0)
                    c++;
        }
        printf("\b \n");
    }

    return 0;
}

三、总体分析

首先我们先进行输入,判断输入的个数和具体数据,然后我们再计算素数并储存,最后我们将具体数据通过模素数的方式来确定素数,然后打印结束。

四、详细分析

  1. 输入

我们可以首先把最简单的部分写出,就是输入部分,由于需要多个数字,我们选择创建一个数组arr1。然后由k来确定个数。但是注意,k的范围是1~10,所以在写的时候还要判断是否属于这个范围,

如果不属于这个范围,我们可以用goto语句来返回到开始。

int main()
{
    int k = 0;//个数
    long int arr1[10] = { 0 };
    int i = 0;//arr1下标
agian:
    printf("请输入需要分解的个数:");
    scanf("%d", &k);
    if (k <= 0 || k > 10)
    {
        printf("请输入1~10之间的数\n");
        goto agian;
    }
    else
    {
        for (i = 0; i < k; i++)
        {
            scanf("%d", &arr1[i]);
        }
    }
    for (i = 0; i < k; i++)
        printf("%d ",arr1[i]);
    //输入
    return 0;
}

其中最后一个for循环打印是为了在写代码中途能够便于检查,检查完之后是需要删除的。

测试结果

通过测试,发现输入没有问题,接下来写输出。

  1. 输出

(1)、储存素数

因为要求输出素数乘积,所以需要计算出素数,由于有多个数据需要计算,所以这里先一个一个来计算储存,这里用arr2来储存素数。用n来记录素数个数。

    int n = 0;//素数的个数
    long int arr2[10000] = { 0 };
    int a = 0;//arr2下标
    int j = 0;//素数
    for (j = 2; j <= arr1[i]; j++)
    {
        if (1 == Su(j))
        {
            arr2[a] = j;
            a++;
            n++;
        }
    }//存素数

这里如果Su(j)返回1,就说明j为其中一个素数,储存起来,然后n++来记录有多少个素数。如果对素数函数不是很熟的可以参考其他求素数文章。这里同样可以把arr2数组打印出来测试一下,这里我就偷个懒了。

(2)、打印素数乘积

我们需要思考,怎么样才能将最小的素数一个一个算出来,我们可以用除法,利用for循环将之前储存的素数由小到大利用,问题在于,如果有多个相同的数呢?运用余数是否为0就可以很好的解决了。

        int c = 0;//重新标记arr2下标
        for (int d = 0; d < n; d++)
        {
            if(arr1[i] % arr2[c] == 0)
            {
                arr1[i] = arr1[i] / arr2[c];
                printf("%d*", arr2[c]);    
            }
            else if (arr1[i] % arr2[c] != 0)
                    c++;
        }

这里我们要判断循环多少次,之前记录的素数个数n就派上用场了。

如果被除数除以素数余0,说明被除尽了,那么这个素数就是其中一个因子,然后我们需要更新这个被除数,以便后面的重复操作,再把该素数打印出来,由于需要的输出结果样式是“2*2*3”这样的,所以还得加上‘*’。

如果余数不为0,那就跳过,判断下一个,c++。依此重复。

再次说明这里的储存和打印都只是一个数据,计算k个数据我们就得进行k次循环,所以我们得加个for循环,将储存和打印包含起来。

最后,我们发现每组数据结果最后面有一个‘*’,且两组数据在同一行,此时我们只需在循环结束后打印退格符‘\b’和换行符‘\n’就结束啦。

五、总结

我们做这种代码行数多,功能较为复杂的题目需要一个功能一个功能来完成,并且如果中途能测试就多做测试来判断代码是否有问题。最后,如果哪里还不是很清楚可以私信博主,博主一一会为你解答的哦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值