一、题目描述
即要求我们将用户输入的一些数字,用多个素数的乘积来显示出来,并将它们由从小到大的顺序排列。其中,输入的第一个数字表示:需要分解几个数字(个数需在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;
}
三、总体分析
首先我们先进行输入,判断输入的个数和具体数据,然后我们再计算素数并储存,最后我们将具体数据通过模素数的方式来确定素数,然后打印结束。
四、详细分析
输入
我们可以首先把最简单的部分写出,就是输入部分,由于需要多个数字,我们选择创建一个数组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)、储存素数
因为要求输出素数乘积,所以需要计算出素数,由于有多个数据需要计算,所以这里先一个一个来计算储存,这里用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’就结束啦。
五、总结
我们做这种代码行数多,功能较为复杂的题目需要一个功能一个功能来完成,并且如果中途能测试就多做测试来判断代码是否有问题。最后,如果哪里还不是很清楚可以私信博主,博主一一会为你解答的哦。