列舉與遞推
- 由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;
}
截圖:
- 最大子段和問題。給定由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;
}
截圖: