1. 程式人生 > >mooc C語言練習題 函式 分解質因數 完數

mooc C語言練習題 函式 分解質因數 完數

1.分解質因數:短除法,從2開始,僅當每個因子除完以後再除下一個。比如2除完,除3,等再除4的時候必然無用,因為2是4的質因數,能整除4的一定能整除2

題目內容:

每個非素數(合數)都可以寫成幾個素數(也可稱為質數)相乘的形式,這幾個素數就都叫做這個合數的質因數。比如,6可以被分解為2x3,而24可以被分解為2x2x2x3。

現在,你的程式要讀入一個[2,100000]範圍內的整數,然後輸出它的質因數分解式;當讀到的就是素數時,輸出它本身。

提示:可以用一個函式來判斷某數是否是素數。

輸入格式:

一個整數,範圍在[2,100000]內。

輸出格式:

形如:

n=axbxcxd

n=n

所有的符號之間都沒有空格,x是小寫字母x。abcd這樣的數字一定是從小到大排列的。

輸入樣例:

18

輸出樣例:

18=2x3x3


#include <iostream>
#include <stdio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int isPrime(int num)             //判斷是否是素數,返回標誌isPrime,isPrime=1是,0不是
{
	int isPrime=1;
	for(int i=2;i<num;i++)  
        {  
            if(num%i==0)   
            {  
                isPrime=0;  
                break;  
            }     
        }  
    return isPrime;
}

int main(int argc, char** argv) {
	int num;
	scanf("%d",&num);
	if(isPrime(num)) printf("n=%d",num);         //是素數直接輸出
	else{
		printf("n=");
		for(int i=2;num!=1;i++)
		{       //從2開始除,取商做下一輪,商1代表結束
			if(num%i==0) {
				num/=i;
				num!=1?printf("%dx",i):printf("%d",i);      //最後一個質因數後面列印不跟x
				i--;                                        //保證把一個質因數除完
			}		
		}
	}
	return 0;
}

2.完數

題目內容:

一個正整數的因子是所有可以整除它的正整數。而一個數如果恰好等於除它本身外的因子之和,這個數就稱為完數。例如6=1+2+3(6的因子是1,2,3)。

現在,你要寫一個程式,讀入兩個正整數n和m(1<=n<m<1000),輸出[n,m]範圍內所有的完數。

提示:可以寫一個函式來判斷某個數是否是完數。

輸入格式:

兩個正整數,以空格分隔。

輸出格式:

其間所有的完數,以空格分隔,最後一個數字後面沒有空格。如果沒有,則輸出一行文字:

NIL

(輸出NIL三個大寫字母加回車)。

輸入樣例:

1 10

輸出樣例:

6

#include <iostream>
#include  <stdio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int isPrime(int num)
{
	if(num==1)   return 0;       //1不是素數但,1不是完數此處為了方便return 0
	for(int i=2;i<num;i++)
	{
		if(num%i==0) return 0;
	}
	return 1;
}

int isPerfect(int num)
{
	int i,j=0,sum=0;
	int factr[30]={0};           //靜態陣列的大小需要多次嘗試後確定,否則會有segment fault 

	if(isPrime(num)) return 0;
	
	for(i=1;i<num;i++)
	   if(num%i==0) 
	   {
		factr[j]=i;
		j++;
	   }
	
	for(--j;j>=0;j--)
	  sum+=factr[j];
	
	if(sum==num) return 1;
	else return 0;
}
void printPerfect(int n,int m)
{	
	for(int i=n;i<=m;i++)
	{
		if(isPerfect(i)) printf("%d\n",i);
	}
}

int main(int argc, char** argv) {
	int n,m;
	scanf("%d %d",&n,&m);
	printPerfect(n,m);
	return 0;
}