C语言 因式分解

如题所述

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

温馨提示:答案为网友推荐,仅供参考
第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;
}

本回答被网友采纳
第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
{
下一级递归...
}
}
}
有问题欢迎追问,满意请采纳
第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;
}
第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; 
}