mooc C語言練習題 函式 分解質因數 完數
阿新 • • 發佈:2019-02-04
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; }