合數編程題
你所講的就是篩選法。
用篩選法解題要遵循以下原則:確定范圍, 根據條件, 逐個實驗, 篩區不符合條件的解. 在實際情況下, 如果不符合條件的元素或集合容易求的, 而確定的范圍也有限,則可以優先考慮用篩選法.
下面舉一個求某范圍內素數例子來說明: 用篩選法求素數時有一個著名的方法叫做Eratosthenes篩選法.
方法大致如下:當求1倒100的素數時, 1不是素數,當然劃去, 在2到100內劃去2的倍數(不包括2), 再劃去3的倍數(不包括3),(由於4已經劃去)劃去5的倍數,直至劃去不超過10的倍數,剩下的就都是素數.需要知道的是在初等數論中有有這樣的定理: 合數N的不等於1的最小正因數不大於N的平方根.
對於Redraiment猜想,下面這個代碼可以pass,但是是嚴格來說是不行的,僅僅是因為測試用例的不全面所致,應該還是有好的演算法的(看過大蝦pass0ms的,汗!),不能這樣一個一個的去判斷,對於要求100000000以內的素數個數的話就算用該演算法法也要6秒多。
#include <iostream>
#include <cmath>
using namespace std;
#define max 10000002
bool a[max+1]; //注意,要用bool型,否則在有的伺服器上不能通過
int main()
{
int n,i,s,j,t;
memset(a,1,sizeof(a));
t=sqrt(max);
for(i=2;i<=t;i++)
if(a[i]) // 很重要,演算法的優化,否則會超時
{
for(j=i;j*i<=max;j++)
a[i*j]=0;
}
while(cin>>n&&n!=0)
{
s=0;
for(i=2;i<=n;i++) if(a[i]) s++;
cout<<s<<endl;
}
return 0;
}
來自我的博客http://hi..com/yyvszh/blog/item/a75b872c97c2983d349bf792.html
B. 編寫程序,從控制台讀入一個合數,將其分解
#include <stdio.h>
int isprime(unsigned long n)
{
unsigned long i;
if(n<2)
return 0;
for(i=2;i*i<=n;++i)
if(n%i==0)
return 0;
return 1;
}
int main()
{
unsigned long n,i;
while(scanf("%lu",&n)==1)
{
for(i=2;n>1;)
{
if(isprime(i)&&n%i==0)
{
printf("%lu ",i);
n/=i;
}
else
i++;
}
printf(" ");
}
return 0;
}
C. 編程題,正整數,如果它能被7整除,或者它的十進製表示法中某個位數上的數字為7,則稱其為與7相關的數見補充
任何數至少有兩個因數,一個是1,另一個是這個數本身。例如7這個數,它既能被1整除(即1是它的因數),也能被它本身7整除(即7是它的因數 )。但有的數除了1和它本身外,還有其它的因數,比如9,除了1和9是它的因數外,它還有因數3。 再比如6,除了1和6是它的因數外,2和3也是它的因數 。 所有這些除了1和它本身外還有其它因數的數,就叫合數。剛才說的9和6就都是合數。而像5、7、11這樣的數,只有1 和它本身這兩個因數,它們 就叫質數。
D. c語言編程題判斷m是否為合數
不是素數就是合數,只要判斷是否為素數就行了。也即判斷m能否與大於零小於m的整數相除余數為零:#includes<stdio.h>main()int m,i;for(i=2;i<m;i++){if(m%i=0)printf("m是合數");break;}
E. 求1至100之間的合數之和JAVA編程題
public class Test{
public static void main(String []args){
int cn = 0;
for(int i=1;i<=100;i++){
i=i%10;
cn = cn+i;
}
System.out.println("個位上數之和 "+cnt);
}
}
F. 能幫我讀一下這道程序題吧,謝謝
#include<stdio.h>
intmain()
{
inta[10001],i,j,n,k=1;
//創建一個10000的數組,每個元素對應其標號。
for(i=1;i<=10000;i++)
a[i]=i;
//保留數組內所有的質數,合數下標對應的元素變為0
for(i=2;i<=100;i++)
for(j=i+i;j<=10000;j+=i)
a[j]=0;
//輸入一個數字,輸出該數字是兩個質數和的組數
while(scanf("%d",&n),n)
{
k=0;
for(i=3;i+i<n;i+=2)
if(a[i]&&a[n-i])
{
k++;
cout<<a[i]<<","<<a[n-i]<<endl;
}
printf("%d ",k);
}
return0;
}
G. 用C++編寫一個判斷素數合數的程序,要求輸入素數時顯示出「此數是素數」,輸入合數時給出該合數的分解式
#include<iostream.h>
boolprime(intn)//判斷是否為素數
{
inti;boolflag=true;
for(i=2;i<=n/2;i++)
if(n%i==0)flag=false;
if(flag==true||n==2)return1;//是的話返回true
return0;//否則flase
}
intfun(intn)//將合數分解,這里用了函數的遞歸調用
{
inti;
if(prime(n))
{cout<<n;return0;}
for(i=2;i<n;i++)
{
if(n%i==0&&prime(i))
cout<<i<<'*';
elsecontinue;
break;
}
fun(n/i);
}
voidmain()
{
intn;
cout<<"請輸入一個數字n:";
cin>>n;
if(prime(n))cout<<"此數為素數。"<<endl;
else{cout<<"此數為合數:"<<"n=";fun(n);cout<<endl;}
}
H. 有c語言編程題嗎
有
1、程序每次讀入一個正三位數,然後輸出逆序的數字。注意,當輸入的數字含有結尾的0時,輸出不應帶有前導的0。比如輸入700,輸出應該是7。
2、UTC是世界協調時,BJT是北京時間,UTC時間相當於BJT減去8。現在,你的程序要讀入一個整數,表示BJT的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果分小於10分,需要保留十位上的0。如1124表示11點24分,而905表示9點5分,36表示0點36分,7表示0點7分。
有效的輸入范圍是0到2359,即你的程序不可能從測試伺服器讀到0到2359以外的輸入數據。
你的程序要輸出這個時間對應的UTC時間,輸出的格式和輸入的相同,即輸出一個整數,表示UTC的時和分。整數的個位和十位表示分,百位和千位表示小時。如果小時小於10,則沒有千位部分;如果小時是0,則沒有百位部分;如果分小於10分,需要保留十位上的0。
提醒:要小心跨日的換算。
3、你的程序要讀入一系列正整數數據,輸入-1表示輸入結束,-1本身不是輸入的數據。程序輸出讀到的數據中的奇數和偶數的個數。
4、我們認為2是第一個素數,3是第二個素數,5是第三個素數,依次類推。
現在,給定兩個整數n和m,0<n<=m<=200,你的程序要計算第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
5、每個非素數(合數)都可以寫成幾個素數(也可稱為質數)相乘的形式,這幾個素數就都叫做這個合數的質因數。比如,6可以被分解為2x3,而24可以被分解為2x2x2x3。
現在,你的程序要讀入一個[2,100000]范圍內的整數,然後輸出它的質因數分解式;當讀到的就是素數時,輸出它本身。
6、你的程序要讀入兩個多項式,然後輸出這兩個多項式的和,也就是把對應的冪上的系數相加然後輸出。
程序要處理的冪最大為100。
7、你的程序要讀入一行文本,其中以空格分隔為若干個單詞,以『.』結束。你要輸出這行文本中每個單詞的長度。這里的單詞與語言無關,可以包括各種符號,比如「it's」算一個單詞,長度為4。注意,行中可能出現連續的空格。