演算法 《演算法競賽入門經典》第二章 示例及答案

2021-07-22 09:48:17 字數 4631 閱讀 1111

輸出1,2,3……n的值

#includeint main()

aabb

輸出所有形如aabb的4位完全平方數(即前兩位數字相等,後兩位數字也相等)。

/*

*7744問題--版本一

*開平方看平方根是否為整數

*/#include#includeint main()

return 0;

}

程式2-3

/*

*7744問題--版本二

*列舉平方根

*/#includeint main()

return 0;

}

3n+1問題

猜想:對於任意大於1的自然數n,若n為奇數,則將變為3n+1,否則變為n的一半。經過若干次這樣的變換,一定會使n變為1.例如,3→ 10→ 5→ 16→ 8→ 4→2→ 1.

輸入n,輸出變換的次數。n≤109

樣例輸入: 3

樣例輸出: 7

/*

*有bug版本

*/#includeint main()

printf("%d\n",count);

return 0;

}

程式2-5

/*

*題中乙個陷阱就是當輸入為987654321時,3n+1的值會溢位

*解決辦法是用乙個long long型別的變數儲存n

*/#includeint main()

printf("%d\n",count);

return 0;

}

近似計算

計算π/4=1-1/3+1/5-1/7+……,知道最後一項小於10-6

#includeint main()

printf("%f\n",sum);

return 0;

}

階乘之和

輸入n,計算s=1!+2!+3!+……+n!的末六位(不含前導0)。n≤10e6,n!表示前n個正整數之積。

樣例輸入:

樣例輸出:

//階乘之和--版本一

//迴圈直接求

#includeint main()

printf("%d\n",sum%1000000);

return 0;

}

程式2-8

//階乘之和--版本二

//每步取模

//因為25!末尾有6個0,所以可以不用計算大於25的階乘

#includeint main()

printf("%d\n",sum);

return 0;

}

資料統計

輸入一些整數,求出他們的最小值、最大值和平均值(保留三位小數)。輸入保證這些數都是不超過1000的整數。

樣例輸入:

2 8 3 5 1 7 3 6

樣例輸出:

1 8 4.375

//資料統計--版本一

//有bug,變數未初始化時值不確定

#includeint main()

printf("%d %d %.3f\n",min,max,(double)s/n);

return 0;

}

程式2-10

//資料統計--版本二

//重定向版

//輸入輸出重定向,使用檔案輸入輸出

#define local

#include#define inf 10000000

int main()

printf("%d %d %.3f\n",min,max,(double)s/n);

return 0;

}

程式2-11

//資料統計--版本三

//fopen版

//使用檔案指標

#include#define inf 1000000

int main()

fprintf(fout,"%d %d %.3f\n",min,max,(double)s/n);

fclose(fin);

fclose(fout);

return 0;

}

資料統計ⅱ

輸入一些整數,求出它們的最小值、最大值和平均值(保留三位小數)。輸入保證這些數都是不超過1000的整數。

輸入包含多組資料,每組資料第一行是整數個數n,第二行是n個整數。n=0為輸入結束標記,程式應當忽略這組資料。相鄰兩組資料之間應輸出乙個空行。

樣例輸入:

2 8 3 5 1 7 3 6

-4 6 10 0

樣例輸出:

case 1:1 8 4.375

case 2:-4 10 3.000

//資料統計--版本一

//有bug

//沒有重置min,max

#include#define inf 1000000

int main()

if(kase)printf("\n");

printf("case %d:%d %d %.3f\n",++kase,min,max,(double)s/n);

}return 0;

}

//資料統計--版本二

//修改版

//重置min,max

#include#define inf 1000000

int main()

if(kase)printf("\n");

printf("case %d:%d %d %.3f\n",++kase,min,max,(double)s/n);

}return 0;

}

水仙花數(daffodil)

輸出100~999中的所有水仙花數。若3位數abc滿足abc=a^3+b^3+c^3,則稱其為水仙花數。例如153=1^3+5^3+3^3,所以153是水仙花數。

#includeint main()

return 0;

}

韓信點兵(hanxin)

相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排的變換隊形,而他每次只掠一眼隊伍的尾巴就知道總人數了。輸入包含多組資料,每組資料報含3個非負整數a,b,c,表示每種隊形排位的人數(a<3,b<5,c<7),輸出總人數的最小值(或報告無解)。已知總人數不小於10,不超過100。輸入到檔案結束為止。

樣例輸入:

2 1 6

2 1 3

樣例輸出:

case 1:41

case 2:no answer

#includeint main()

}if(!result)

printf("case %d: no answer\n",count);

}return 0;

}

倒三角形(********)

輸入正整數n≤20,輸出乙個n層的倒三角形。例如,n=5時輸出如下:

#########

#######

#####

####

#includeint main()

return 0;

}

分數化小數

輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位。a,b≤10^6,c≤100。輸入包含多組資料,結束標記為a=b=c=0。

樣例輸入:

1 6 4

0 0 0

樣例輸出:

case 1: 0.1667

//printf的特殊用法

//printf("%.*f",m,x);

//*號對應m,用於動態指定小數字數

#includeint main()

return 0;

}

排列(permutation)

#includeint main()

if(result)

printf("%d %d %d\n",abc,def,ghi);

}return 0;

}

題目1.假設需要輸出2,4,6,8,……,2n,每個一行,能不能通過對程式2-1進行小小的改動來實現呢?為了方便,現把程式複製如下:

#includeint main()

任務1:修改第7行,不修改第6行。

任務2:修改第6行,不修改第7行。

#includeint main()

演算法競賽入門經典第二章

123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 3233 3435 3637 3839 4041 4243 4445 4647 4849 5051 5253 5455 5657 5859 6061 6263 6465...

演算法競賽入門經典 第二章 如何判斷整數

date 2010 4 15 例題2 1 輸出所有形如aabb的四位完全平方數 即前兩位數字相等,後兩位數字也相等 一.思路1 該題的大體思路是十分清晰的,即 迴圈 if 的搭檔進行篩選.具體點說就是通過2重迴圈將所有aabb數枚舉出來,再通過if來篩選出是完全平方數的數.實現 這裡提到了乙個常用的...

演算法競賽入門經典第二章上機以總結

2 1 題目 輸入乙個不超過10 9的正整數,輸出它的位數。例如12735的位數是5。請不要使用任何數學函式,只用四則運算和 迴圈語句實現 include include int main int argc,char argv printf 位數為 d n k 2 2 輸出100 999中的所有水仙...