首先先描述題目
標題:幸運數 幸運數是波蘭數學家烏拉姆命名的。它采用與生成素數類似的“篩法”生成。 首先從1開始寫出自然數1,2,3,4,5,6,.... 1 就是第一個幸運數。 我們從2這個數開始。把所有序號能被2整除的項刪除,變為: 1 _ 3 _ 5 _ 7 _ 9 .... 把它們縮緊,重新記序,為: 1 3 5 7 9 .... 。這時,3為第2個幸運數,然后把所有能被3整除的序號位置的數刪去。注意,是序號位置,不是那個數本身能否被3整除!! 刪除的應該是5,11, 17, ... 此時7為第3個幸運數,然后再刪去序號位置能被7整除的(19,39,...) 最后剩下的序列類似: 1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, ...
我這里寫的代碼 沒有遵守題目要求 , 而是把所有的 1-n 之間的幸運數輸出并計算個數
1 不算幸運數
就這個題而言 我們可以運用篩選法的原理 也就是素數打表的思想 來解決
如果序號可以整除的話 就讓對應的位置賦值為0 然后下次循環 進行篩選不為0 的下一項
下面的源代碼
/* 幸運數  */#include<stdio.h>#include<string.h>const int N=1000;int a[N];int n,m;void input(){	for(int i=1;i<=n;i++)		a[i]=i;}void output(){	int i,ans=0;	for(i=m;i<n;i++)		if(a[i]){			PRintf("%d ",a[i]);			if(i==1) continue;			ans++;		}			printf("/n");	printf("%d/n",ans);}void Luckly_Num(){	int i,j,k,cout,temp,sum=1;	for(i=2;i<=n;i++)	{		if(!a[i])			continue; //		for(k=i;a[k]==0;k++)//			 sum++;		temp=a[i];		for(j=1,cout=0;j<=n;j++)		{			if(a[j])			{				cout++;				if(cout%temp==0)				{					a[j]=0;				}					}		}	}}int main(){	int i,j;	while(scanf("%d %d",&m,&n))	{				input();//3?ê??ˉ		Luckly_Num(); //o?D? 		output();// ê?3? 	}}我這里把整個運行步驟給輸出出來了:
新聞熱點
疑難解答