#includestdio.h
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、迪慶州ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的迪慶州網(wǎng)站制作公司
#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請(qǐng)輸入正整數(shù)m(1):");
scanf("%u",?m);
printf("打印詳細(xì)分解情況嗎?[y|n,回車(chē)打印]");
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是素?cái)?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é)果(包括最后一個(gè)因子)
Factor(n/i,s2,printYes);
cnt++;
}
}
}
【解題思路】
對(duì)一個(gè)數(shù)進(jìn)行因式分解,可以采用遞歸的辦法,先找出這個(gè)數(shù)最小的因式,然后再把這個(gè)數(shù)除以因式,繼續(xù)找,直到除到這個(gè)數(shù)成為質(zhì)數(shù)為止。比如要對(duì)60進(jìn)行因式分解,可以先找到60的最小因式2;然后再把60除以2得到30,接著找30的最小因式得到2;再把30除以2得到15,接著找15的最小因式3;然后再把15除以3得到5;然后5是質(zhì)數(shù),無(wú)法再分解,最終就得到60的因式共有4個(gè),分別是2,2,3,5。而判斷一個(gè)數(shù)b是不是另一個(gè)數(shù)a的因式必須符合兩個(gè)標(biāo)準(zhǔn),一是a必須能被b整除;二是b必須是質(zhì)數(shù)。根據(jù)以上思路,代碼如下:(為了簡(jiǎn)化程序,這里把判斷是否質(zhì)數(shù)和分解因式都分別做成一個(gè)獨(dú)立的函數(shù))
【程序代碼】
#include?iostream?????????????//控制臺(tái)操作頭文件
#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ù),開(kāi)方可以減少檢測(cè)個(gè)數(shù)?
for(i=2;i=n;i++)??????????????//逐個(gè)檢測(cè)能不能被整除?
if(a%i==0)?return?false;???//如果能被整除說(shuō)明不是質(zhì)數(shù),?返回0;??return?true;}?????????????????//檢測(cè)完了還沒(méi)可以被整除的數(shù),返回1
//---------------
void?Ys(int?s[],int?a)???????????//因式分解的遞歸函數(shù)
/*s是存放各個(gè)因式的數(shù)組,其中s[0]為因式個(gè)數(shù),a是要分解因素的數(shù)字*/
{int?i,n;???????????????????????//循環(huán)變量和因式個(gè)數(shù)
n=++s[0];??????????????????????//每遞歸調(diào)用一次因式個(gè)數(shù)增加1
if(SS(a))?{s[n]=a;?return?;}???//如果a是質(zhì)數(shù),沒(méi)有因式,函數(shù)結(jié)束
for(i=2;ia;i++)???????????????//由小到大找出a的第一個(gè)因式
if(SS(i)a%i==0)?break;???//如果i是質(zhì)數(shù)并且a可以被i整除
s[n]=i;????????????????????????//保存這個(gè)因式
Ys(s,a/i);}????????????????????//遞歸調(diào)用函數(shù)繼續(xù)分解下個(gè)因式
//---------------?
int?main()??????????????????????????????//主函數(shù)
{int?a,i;???????????????????????????????//整型變量?
int?S[100];????????????????????????????//用于存放因式的數(shù)組
for(;;)????????????????????????????????//弄一個(gè)無(wú)窮循環(huán)?
{printf("請(qǐng)輸入一個(gè)正整數(shù)(-1結(jié)束):");?//顯示提示信息
scanf("%d",a);????????????????????//從鍵盤(pán)輸入一個(gè)整數(shù)
if(a==-1)?break;???????????????????//如果輸入-1退出循環(huán)
if(a0)?continue;??????????????????//如果輸入不是正數(shù)重新輸入
S[0]=0;????????????????????????????//因式個(gè)數(shù)清零
Ys(S,a);???????????????????????????//調(diào)用函數(shù)分解因式
printf("%d共有%d個(gè)因式,分別是:",a,S[0]);//顯示因式個(gè)數(shù)
for(i=1;i=S[0];i++)?printf("%d?",S[i]);//顯示各個(gè)因式
printf("\n\n");}???????????????????//顯示完所有因式換行
printf("\n");??????????????????????????//結(jié)束程序前再空一行
system("PAUSE");???????????????????????//屏幕暫停查看顯示結(jié)果
return?0;}?????????????????????????????//結(jié)束程序
【運(yùn)行結(jié)果】
以上程序在DEV?C++上運(yùn)行通過(guò)。
截圖如下:
#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("方程無(wú)實(shí)數(shù)根\n");}main(){floata,b,c;printf("請(qǐng)輸入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);}