1. 程式人生 > 其它 >列舉與遞推

列舉與遞推

  1. 由0到4五個數字,組成5位數,每個數字用一次,但十位和百位不能為3(當然萬位不能為0),輸出所有可能的五位數。
 #include <stdio.h>
int main()
{
	int n,count=0;
	int g,s,b,q,w;
	for(w=1;w<=4;w++)
	{
		for(q=0;q<=4;q++)
		{
			if(w==q)
				continue;
			for(b=0;b<=4;b++)
			{
				if(w==b||q==b||b==3)
					continue;
				for(s=0;s<=4;s++)
				{
					if
(w==s||q==s||b==s||s==3) continue; for(g=0;g<=4;g++) { if(w==g||q==g||b==g||s==g) { continue; } n=w*10000+q*1000+b*100+s*10+g; printf("%d ",n); count++; } } } } } printf("\n"); printf("%d \n",count); return
0; }

截圖:在這裡插入圖片描述

  1. 最大子段和問題。給定由n個整陣列成的序列,求序列中子段的最大和,若所有整數均為負整數時定義最大子段和為0。
    例如, 當(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)時,最大子段和為: a2+a3+a4=20
    輸入格式:
    第一行輸入整數個數n(1≤n≤10000),再依次輸入n個整數。
    輸出格式:
    輸出第一行為最大子段和,第二行為子段第一個數和最後一個數在整個序列中的位序。
    輸入樣例1:
    6
    -2 11 -4 13 -5 -2
    輸出樣例1:
    20
    2 4
#include <stdio.h>
int main()
{
	int n,summax=
0,t,k; int x=0, y=0; int flag = 0; scanf("%d",&n); int a[100001]; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); if (a[i] >= 0) flag = 1; } for (int s = 0; s < n; s++) for (int j = s; (j+s)<n; j++) { t=0; for (int k = s; k < (j+s); k++) t += a[k]; if (t > summax) { summax = t; x = s + 1; y = j + s; } } if (flag!=0) { printf("%d\n", summax); printf("%d %d\n", x, y); } else printf("0"); return 0; }

截圖:
在這裡插入圖片描述
3. 有兩隊選手每隊5人進行一對一的比賽,甲隊為A、B、C、D、E,乙隊為J、K、L、M、N,經過抽籤決定比賽對手名單。規定A不和J比賽, M不和D及E比賽。列出所有可能的比賽名單。

#include <stdio.h>
int main()
{
	char a[5]={'A','B','C','D','E'};
	char b[10]={'A','B','C','D','E','J','K','L','M','N'};
	int i,j;
	int count=0;
	printf("\t");
	for(i=0;i<5;i++){
		for(j=0;j<10;j++)
		{
			if(((i==0)&&(j==5))||((i==3)&&(j==8))||((i==4)&&(j==8))||i==j)
				continue;
			printf("%c VS %c  \t",a[i],b[j]);
			
			count++;
		}
	}
	printf("\n");
	printf("共有%d種可能的比賽名單\n",count);
	return 0;
}

截圖:在這裡插入圖片描述

5.有5個海盜,相約進行一次帆船比賽。比賽中天氣發生突變,他們被衝散了。
恰巧,他們都先後經過途中的一個無名的荒島,並且每個人都信心滿滿,覺得自己是第一個經過該島的人。
第一個人在沙灘上發現了一堆金幣。他把金幣分成5等份。發現剛好少一個金幣。他就從自己口袋拿出一個金幣補充進去,然後把屬於自己的那份拿走。
第二個到達的人也看到了金幣,他也和第一個人一樣,把所有金幣5等分,發現剛好缺少一個金幣,於是自己補進去一個,拿走了屬於自己的那份。 第三,第四,第五人的情況一模一樣。
等他們到了目的地,都說自己的情況,才恍然大悟,一起去荒島找金幣,然而再也沒有找到荒島。他們都惋惜地說:島上還有一千多枚金幣呢!
請你根據這些資訊,推算荒島上最初有多少金幣?

#include <stdio.h>
int main()
{
	int num;//島上剩餘的金幣數
	int flag,i,j;
	for(i=1000;i<2000;i++)//根據題意“島上還有一千多枚金幣”知
	{
		flag=1;
		num=i;
		for(j=1;j<=5;j++)//共有五個人
		{
			if(num%4!=0)//先到島上的那個人總是認為自己是第一個到的
				flag=0;
			num=(num+num/4)-1;
		}
		if(flag&&(num+1)%5==0)
			printf("%d\n",num);
	}
	return 0;
}

截圖:
在這裡插入圖片描述
6.任意給定一個正整數N,
如果是偶數,執行: N / 2
如果是奇數,執行: N * 3 + 1

生成的新的數字再執行同樣的動作,迴圈往復。

通過觀察發現,這個數字會一會兒上升到很高,
一會兒又降落下來。
就這樣起起落落的,但最終必會落到“1”
這有點像小冰雹粒子在冰雹雲中翻滾增長的樣子。

比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的時候,這個“小冰雹”最高衝到了52這個高度。

輸入格式:
一個正整數N(N<1000000)
輸出格式:
一個正整數,表示不大於N的數字,經過冰雹數變換過程中,最高衝到了多少。

例如,輸入:
10
程式應該輸出:
52

再例如,輸入:
100
程式應該輸出:
9232

#include <stdio.h>
int fact(int N,int max)
{
	if(N==1)
		return max;
	else
	{
		if(N%2==0)
		{
			N=N/2;
			if(N>max)
				max=N;
			return fact(N,max);
		}
		else 
		{
			N=N*3+1;
			if(N>max)
				max=N;
			return fact(N,max);
		}
	}
}
int main()
{
	int N;
	int t=1;
	scanf("%d",&N);
	for(int i=1;i<N;i++)
	{
		int max=fact(i,i);
		if(max>t)
			t=max;
	}
	printf("%d\n",t);
	return 0;
}

截圖:
在這裡插入圖片描述
在這裡插入圖片描述