Problem Description
把一個(gè)偶數(shù)拆成兩個(gè)不同素?cái)?shù)的和,有幾種拆法呢霸褒?
Input
輸入包含一些正的偶數(shù),其值不會(huì)超過(guò)10000,個(gè)數(shù)不會(huì)超過(guò)500宠纯,若遇0灸撰,則結(jié)束。
Output
對(duì)應(yīng)每個(gè)偶數(shù),輸出其拆成不同素?cái)?shù)的個(gè)數(shù)蜒程,每個(gè)結(jié)果占一行税弃。
Sample Input
30
26
0
Sample Output
3
2
2.思考:
一開始直接用傳統(tǒng)做法去遍歷素?cái)?shù)纪岁,后來(lái)發(fā)現(xiàn)這樣做當(dāng)數(shù)字變得很大的時(shí)候可能會(huì)因?yàn)檠h(huán)次數(shù)多而導(dǎo)致超時(shí)所以就去找簡(jiǎn)化的算法,想到了之前做過(guò)的有一題就是用到了這個(gè)算法:對(duì)輸入的數(shù)n開根號(hào)则果,n只需被 2 到√n之間的每一個(gè)整數(shù)去除就可以了幔翰,能至少被一個(gè)數(shù)整除則n不為素?cái)?shù),否則n必定為素?cái)?shù)西壮。
原因:因?yàn)槿绻鹡 能被 2 ~ n-1 之間任一整數(shù)整除遗增,其二個(gè)因子必定有一個(gè)小于或等于 √n,另一個(gè)大于或等于 √n款青。例如 16 能被 2做修、4、8 整除,16=2x8饰及,2 小于 4蔗坯,8 大于 4,16=4x4燎含,4=√16步悠,因此只需判定在 2~4 之間有無(wú)因子即可。
遇到的問(wèn)題:一開始被拆分的意思誤導(dǎo)了瘫镇,把題目意思理解成在輸入的數(shù)里找出它所有的因子然后再?gòu)牡贸龅囊蜃永锩嬲页鏊財(cái)?shù)鼎兽,后來(lái)發(fā)現(xiàn)不對(duì)勁,題目是拆分素?cái)?shù)和铣除,素?cái)?shù)和應(yīng)該是兩個(gè)素?cái)?shù)數(shù)的和加起來(lái)等于輸入的數(shù)字n谚咬。
3.代碼:
#include<stdio.h>
#include<math.h>
int sushu(int x){
int i;
for(i=2;i<=sqrt(x);i++){
if(x%i==0)return 0;
}
return 1;
}
int main(){
int i,n,count;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
count=0;
for(i=2;i<=n/2;i++){
if(sushu(i)&&sushu(n-i))
count++;
if(i==n-i){
if(sushu(i)==1)count--;
}
}
printf("%d\n",count);
}
}
4.總結(jié):快速、正確地理解題目意思很有必要尚粘,不然的話由于理解不正確做了一段時(shí)間后才發(fā)現(xiàn)邏輯择卦、思路對(duì)不上答案,得不償失郎嫁。