如题所述
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
unsigned int m=2;
unsigned int cnt=1;
void Factor(int n, char *msg, char printYes);
int main()
{
char s[100]={0};
char flag='y';
printf("------求整数的因式分解------\n请输入正整数m(>1):");
scanf("%u", &m);
printf("打印详细分解情况吗?[y|n,回车打印]");
scanf("%*c%c",&flag);
if(m<1)
{
printf("error input!\n");
exit(-1);
}
if(flag!='n')
printf("%d = %d \n", m,m);
Factor(m, s,flag);
if(cnt==1)
printf("\n%d是素数\n",m);
printf("\n------");
printf("一共有%d种", cnt);
printf("------\n");
return 0;
}
void Factor(int n, char *msg,char printYes)
{
char s2[100]={0};//保存当前分解的部分结果
if(n==1)
return ;
for(int i=2;i<n;i++)
{
if (n%i==0)
{
if(n==m)
sprintf(msg, "%d = ", m);
sprintf(s2,"%s %d * ",msg, i);//因式分解部分结果保存在字符串s2中
if(printYes!='n')
printf("%s %d\n",s2,n/i);//打印结果(包括最后一个因子)
Factor(n/i,s2,printYes);
cnt++;
}
}
}
#include<stdlib.h>
#include<string.h>
unsigned int m=2;
unsigned int cnt=1;
void Factor(int n, char *msg, char printYes);
int main()
{
char s[100]={0};
char flag='y';
printf("------求整数的因式分解------\n请输入正整数m(>1):");
scanf("%u", &m);
printf("打印详细分解情况吗?[y|n,回车打印]");
scanf("%*c%c",&flag);
if(m<1)
{
printf("error input!\n");
exit(-1);
}
if(flag!='n')
printf("%d = %d \n", m,m);
Factor(m, s,flag);
if(cnt==1)
printf("\n%d是素数\n",m);
printf("\n------");
printf("一共有%d种", cnt);
printf("------\n");
return 0;
}
void Factor(int n, char *msg,char printYes)
{
char s2[100]={0};//保存当前分解的部分结果
if(n==1)
return ;
for(int i=2;i<n;i++)
{
if (n%i==0)
{
if(n==m)
sprintf(msg, "%d = ", m);
sprintf(s2,"%s %d * ",msg, i);//因式分解部分结果保存在字符串s2中
if(printYes!='n')
printf("%s %d\n",s2,n/i);//打印结果(包括最后一个因子)
Factor(n/i,s2,printYes);
cnt++;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 推荐于2017-06-16
#include <stdio.h>
int first(int n)//函数功能为找到第一个因子。
{
int r=2;
while(n%r) r++;
return r;
}
int main()
{
int n;
int a;
scanf("%d",&n);
a=first(n);
printf("%d=%d",n,a);
n/=a;
while(n!=1)
{
a=first(n);
printf("*%d", a);
n/=a;
}
printf("\n");
return 0;
}本回答被网友采纳
int first(int n)//函数功能为找到第一个因子。
{
int r=2;
while(n%r) r++;
return r;
}
int main()
{
int n;
int a;
scanf("%d",&n);
a=first(n);
printf("%d=%d",n,a);
n/=a;
while(n!=1)
{
a=first(n);
printf("*%d", a);
n/=a;
}
printf("\n");
return 0;
}本回答被网友采纳
第2个回答 2011-11-23
给你个思路吧,首先,任何数可以表示为:x=p1^N1 × p2^N2 ×……pi^Ni,其中pi 是质数,
因此,你可以如下递归,当然,具体怎么做还是希望你自己实现,自己动手理解更深刻嘛。
//建立一个足够大的质数库
const int MAXP = 31622;
const int PCOUNT = 3401;
int prim[PCOUNT];
int max, numb;
void primes()
{
bool get[MAXP+1];
int i;
for(i = 0;i <= PCOUNT;i++) prim[i] = 0;
for(i = 2;i <= MAXP;i++) get[i] = true;
for(i = 2;i <= MAXP;i++)
if (get[i])
{
int j = i+i;
while(j <= MAXP){get[j] = false;j += i;}
}
for (int ii = 2,j = 0;ii <= MAXP;ii++)
if(get[ii]) prim[++j] = ii;
}
递归函数(当前递归起始质数index,上一级递归数字n)
{
for (int i=index;i<质数库数量;i++)
{
if (x == n*prim(index))//说明找到一种分解
{
print
return;
}
else(x < n*prim(index))//找过了,退回去
{
return;
}
else
{
下一级递归...
}
}
}
有问题欢迎追问,满意请采纳
因此,你可以如下递归,当然,具体怎么做还是希望你自己实现,自己动手理解更深刻嘛。
//建立一个足够大的质数库
const int MAXP = 31622;
const int PCOUNT = 3401;
int prim[PCOUNT];
int max, numb;
void primes()
{
bool get[MAXP+1];
int i;
for(i = 0;i <= PCOUNT;i++) prim[i] = 0;
for(i = 2;i <= MAXP;i++) get[i] = true;
for(i = 2;i <= MAXP;i++)
if (get[i])
{
int j = i+i;
while(j <= MAXP){get[j] = false;j += i;}
}
for (int ii = 2,j = 0;ii <= MAXP;ii++)
if(get[ii]) prim[++j] = ii;
}
递归函数(当前递归起始质数index,上一级递归数字n)
{
for (int i=index;i<质数库数量;i++)
{
if (x == n*prim(index))//说明找到一种分解
{
return;
}
else(x < n*prim(index))//找过了,退回去
{
return;
}
else
{
下一级递归...
}
}
}
有问题欢迎追问,满意请采纳
第3个回答 2010-08-11
// 下面是用我在toj 10004上面通过的代码,稍加修改写成的。
#include <stdio.h>
#include <math.h>
int Prime(int x)
{
int n, i;
n = (int)sqrt(x);
for (i = 2; i <= n; i++)
if (x % i == 0) break;
if (i > n)
return 1;
else
return 0;
}
int main()
{
// freopen("2.txt","w",stdout);
int x;
int t;
int i , n;
int y;
int first;
int max;
while (scanf("%d",&max) == 1)
{
for (y = 2; y <= max; y++)
{
x = y;
if (Prime(x))
{
printf("%d=%d\n",x,x);
}
else
{
printf("%d=",x);
first = 1;
do
{
for (i = 2; i <= x; i++)
{
t = 0; n = 0;
while (x % i == 0)
{
t = 1;
n++;
x = x/i;
}
if (t)
{
if (first) first = 0;
else printf("*");
while (n>1)
{
printf("%d*",i);
n--;
}
printf("%d",i);
}
}
} while(x != 1);
printf("\n");
}
}
}
return 0;
}
#include <stdio.h>
#include <math.h>
int Prime(int x)
{
int n, i;
n = (int)sqrt(x);
for (i = 2; i <= n; i++)
if (x % i == 0) break;
if (i > n)
return 1;
else
return 0;
}
int main()
{
// freopen("2.txt","w",stdout);
int x;
int t;
int i , n;
int y;
int first;
int max;
while (scanf("%d",&max) == 1)
{
for (y = 2; y <= max; y++)
{
x = y;
if (Prime(x))
{
printf("%d=%d\n",x,x);
}
else
{
printf("%d=",x);
first = 1;
do
{
for (i = 2; i <= x; i++)
{
t = 0; n = 0;
while (x % i == 0)
{
t = 1;
n++;
x = x/i;
}
if (t)
{
if (first) first = 0;
else printf("*");
while (n>1)
{
printf("%d*",i);
n--;
}
printf("%d",i);
}
}
} while(x != 1);
printf("\n");
}
}
}
return 0;
}
第4个回答 2019-06-26
#include<stdio.h>
int main()
{ //因式分解
int n,e=1,i=3;
scanf("%d",&n);
if(n<=1)
{
printf("Error.\n");
goto v;
}
printf("%d=",n);
for(;n%2==0;)
{
if(e) printf("%d",2);
else printf("*%d",2);
n/=2;
e=0;
}
for(;n>=2;i+=2)
for(;n%i==0;)
{
if(e) printf("%d",i);
else printf("*%d",i);
n/=i;
e=0;
}
v:
return 0;
}
int main()
{ //因式分解
int n,e=1,i=3;
scanf("%d",&n);
if(n<=1)
{
printf("Error.\n");
goto v;
}
printf("%d=",n);
for(;n%2==0;)
{
if(e) printf("%d",2);
else printf("*%d",2);
n/=2;
e=0;
}
for(;n>=2;i+=2)
for(;n%i==0;)
{
if(e) printf("%d",i);
else printf("*%d",i);
n/=i;
e=0;
}
v:
return 0;
}