//由数学基本定理可知:任何- -个大于1的非素数整数都可以唯一分解成若千个素数的乘积。编写程序,从控制台读入一组大于1的整数(小于等于20个,且每个整数的大小不会超过int数据类型 表示的范围), ,求这些整数分解成素数的最小集。该最小素数集是所有整数分解成的素数的并集 (若输入的整数是素数,则该素数可以直接加入最小素数集),并日重复的素数只保留一个。 按从小到大的顺序输出求得的最小素数集
int main()
{
int a,num1[100],b=1,n,i,m,j;
printf("请您输入您要输入的数字个数:");
scanf("%d",&a);
printf("请依次输入您要输入的数字:");
for(n=1;n<=a;n++)
{
scanf("%d",&i);
b=b*i;
}
printf("%d",b);
for(m=2;m<=b;m++)
{
if(b%m==0)
num1[m-2]=b;
b=b/m;
}
for(j=0;;j++)
if(num1[j]==0)
{
break;
}
else
printf("%d",num1[j]);
}
//遇到的问题就是编译成功之后,运行结果不对
不能这样子算啊,假如他输入了100个3 ,那么你就会打印出一堆来,而不是 只有 3
我写了个代码给你:
有不懂的可以问我。
#include <stdio.h>
#include <math.h>
void getBitmap( char * bitmap , int num );
bool IsPrimeNumber( int x );
bool Get_bit(char * st ,int num );
void Set_bit(char * st ,int num );
int main() {
int inputNum = 0;
int inputList[20] = {0};
char bitmap[1000] = {0};
printf("请您输入您要输入的数字个数:");
scanf("%d", &inputNum);
printf("请依次输入您要输入的数字:");
for (int i = 0; i < inputNum && i < 20; i++) {
scanf("%d", &inputList[i]);
// 找到 这个数分解后的素数
getBitmap(bitmap,inputList[i]);
}
for( int i = 0 ; i < 8000 ; i++ ){
if( Get_bit(bitmap,i) ){
printf("%d",i);
}
}
}
void getBitmap( char * bitmap , int num ){
// 从2 开始
for( int i = 2 ; i <= num ; i++ ){
// 如果 i 可以被 num 整除
if( num % i == 0 ){
// 并且num也是素数的话
if( IsPrimeNumber(i) ){
// 就把 i 保存下来
Set_bit(bitmap,i);
}
}
}
}
bool IsPrimeNumber( int x ){
// 遍历除 1 以外所有比自己小的整数
int sq = sqrt(x);
for( int i = 2 ; i <= sq; i++ ){
if( x%i == 0 ){
// 如果 x 可以被 i 整除 那么就返回的 假 代表这个数不是素数
return false;
} else { /* 如果不能被 i 整除就继续遍历 */ }
}
// 如果除 1 以外所有比自己小的整数都不能被整除,那么他就是素数
if( x <= 1 ){
// 小于 2 的数一定不是素数
return false;
} else {
// 是素数
return true;
}
}
bool Get_bit(char * st , int num ){
// 用一个数组保存下数字有没有的信息
return ( st[(int)(num/8)] & (0x01 << (num % 8) ) ) > 0 ? true : false ;
}
void Set_bit(char * st , int num ){
// 读取这个数字有没有
st[(int)(num/8)] |= (0x01 << (num % 8) ) ;
}
http://t.csdn.cn/Ro1mk
看看这篇文章可以吗?
有用记得采纳呐!