#includestdio.h
創(chuàng)新互聯(lián)專注于龍安企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站定制開發(fā)。龍安網(wǎng)站建設(shè)公司,為龍安等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
#includestdlib.h
#includestring.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("------求整數(shù)的因式分解------\n請輸入正整數(shù)m(1):");
scanf("%u",?m);
printf("打印詳細分解情況嗎?[y|n,回車打印]");
scanf("%*c%c",flag);
if(m1)
{
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是素數(shù)\n",m);
printf("\n------");
printf("一共有%d種",?cnt);
printf("------\n");
return?0;
}
void?Factor(int?n,?char?*msg,char?printYes)
{
char?s2[100]={0};//保存當(dāng)前分解的部分結(jié)果
if(n==1)
return?;
for(int?i=2;in;i++)
{
if?(n%i==0)
{
if(n==m)
sprintf(msg,?"%d?=?",?m);
sprintf(s2,"%s?%d?*?",msg,?i);//因式分解部分結(jié)果保存在字符串s2中
if(printYes!='n')
printf("%s?%d\n",s2,n/i);//打印結(jié)果(包括最后一個因子)
Factor(n/i,s2,printYes);
cnt++;
}
}
}
#include#includevoidm(floata,floatb,floatc){doublex1,x2;x1=(-b+sqrt(b*b-4*a*c))/(2*a);x2=(-b-sqrt(b*b-4*a*c))/(2*a);printf("方程的根是%.2lf和%.2lf",x1,x2);}voidn(floata,floatb,floatc){doublex;x=(-b)/(2*a);printf("方程的根為%.2lf",x);}voidf(floata,floatb,floatc){printf("方程無實數(shù)根\n");}main(){floata,b,c;printf("請輸入a,b,c的值\n");scanf("%f%f%f",a,b,c);if(b*b-4*a*c0)m(a,b,c);if(b*b-4*a*c==0)n(a,b,c);if(b*b-4*a*c0)f(a,b,c);}
#includestdio.h
viod main()
{
int ysfj(int a); /*求數(shù)分解的函數(shù)的聲明*/
int a;
scanf("%d",a);
ysfj(a); /*調(diào)用函數(shù)*/
}
int ysfj(int a)
{
int i=1,j;
printf("%d,",i);
j=a;
for(i=2;ij;i++)
while(a%i==0) /*判斷a能不能被i整除*/
{
if(a%i==0)
{
printf("%d,",i);
a=a/i; }
}
return a;
}
Input
輸入只有一行,一個整數(shù)N
Output
輸出只有一行,一個整數(shù)表示自然數(shù)N的因式分解方案總數(shù)
這是什么東東...
【解題思路】
對一個數(shù)進行因式分解,可以采用遞歸的辦法,先找出這個數(shù)最小的因式,然后再把這個數(shù)除以因式,繼續(xù)找,直到除到這個數(shù)成為質(zhì)數(shù)為止。比如要對60進行因式分解,可以先找到60的最小因式2;然后再把60除以2得到30,接著找30的最小因式得到2;再把30除以2得到15,接著找15的最小因式3;然后再把15除以3得到5;然后5是質(zhì)數(shù),無法再分解,最終就得到60的因式共有4個,分別是2,2,3,5。而判斷一個數(shù)b是不是另一個數(shù)a的因式必須符合兩個標(biāo)準(zhǔn),一是a必須能被b整除;二是b必須是質(zhì)數(shù)。根據(jù)以上思路,代碼如下:(為了簡化程序,這里把判斷是否質(zhì)數(shù)和分解因式都分別做成一個獨立的函數(shù))
【程序代碼】
#include?iostream?????????????//控制臺操作頭文件
#include?math.h???????????????//數(shù)學(xué)函數(shù)頭文件?
//---------------?
bool?SS(int?a)??????????????????//質(zhì)數(shù)判斷函數(shù)(質(zhì)數(shù)返回1,否則0)
{if(a2)?return?false;??????????//小于2的數(shù)都不是質(zhì)數(shù),返回0
if(a==2)?return?true;??????????//2是特殊的質(zhì)數(shù)?
int?i,n=(int)sqrt(a);??????????//n是除數(shù),開方可以減少檢測個數(shù)?
for(i=2;i=n;i++)??????????????//逐個檢測能不能被整除?
if(a%i==0)?return?false;???//如果能被整除說明不是質(zhì)數(shù),?返回0;??return?true;}?????????????????//檢測完了還沒可以被整除的數(shù),返回1
//---------------
void?Ys(int?s[],int?a)???????????//因式分解的遞歸函數(shù)
/*s是存放各個因式的數(shù)組,其中s[0]為因式個數(shù),a是要分解因素的數(shù)字*/
{int?i,n;???????????????????????//循環(huán)變量和因式個數(shù)
n=++s[0];??????????????????????//每遞歸調(diào)用一次因式個數(shù)增加1
if(SS(a))?{s[n]=a;?return?;}???//如果a是質(zhì)數(shù),沒有因式,函數(shù)結(jié)束
for(i=2;ia;i++)???????????????//由小到大找出a的第一個因式
if(SS(i)a%i==0)?break;???//如果i是質(zhì)數(shù)并且a可以被i整除
s[n]=i;????????????????????????//保存這個因式
Ys(s,a/i);}????????????????????//遞歸調(diào)用函數(shù)繼續(xù)分解下個因式
//---------------?
int?main()??????????????????????????????//主函數(shù)
{int?a,i;???????????????????????????????//整型變量?
int?S[100];????????????????????????????//用于存放因式的數(shù)組
for(;;)????????????????????????????????//弄一個無窮循環(huán)?
{printf("請輸入一個正整數(shù)(-1結(jié)束):");?//顯示提示信息
scanf("%d",a);????????????????????//從鍵盤輸入一個整數(shù)
if(a==-1)?break;???????????????????//如果輸入-1退出循環(huán)
if(a0)?continue;??????????????????//如果輸入不是正數(shù)重新輸入
S[0]=0;????????????????????????????//因式個數(shù)清零
Ys(S,a);???????????????????????????//調(diào)用函數(shù)分解因式
printf("%d共有%d個因式,分別是:",a,S[0]);//顯示因式個數(shù)
for(i=1;i=S[0];i++)?printf("%d?",S[i]);//顯示各個因式
printf("\n\n");}???????????????????//顯示完所有因式換行
printf("\n");??????????????????????????//結(jié)束程序前再空一行
system("PAUSE");???????????????????????//屏幕暫停查看顯示結(jié)果
return?0;}?????????????????????????????//結(jié)束程序
【運行結(jié)果】
以上程序在DEV?C++上運行通過。
截圖如下:
// 下面是用我在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 (n1)
{
printf("%d*",i);
n--;
}
printf("%d",i);
}
}
} while(x != 1);
printf("\n");
}
}
}
return 0;
}