干支紀年法—歌賽新規則—紅球多于白球的概率—交換變量—考拉茲猜想—利息計算
①干支紀年法
在我國古代和近代,一直采用干支法紀年。它采用10天干和12地支配合,一個循環周期為60年。
? ?10天干是:甲,乙,丙,丁,戊,己,庚,辛,壬,癸
? ?12地支是:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥
如果某年是甲子,下一年就是乙丑,再下是丙寅,......癸酉,甲戌,乙亥,丙子,....
總之天干、地址都是循環使用,兩兩配對。
? 今年(2012)是壬辰年,1911年辛亥革命
下面的代碼根據公歷年份輸出相應的干支法紀年。已知最近的甲子年是1984年。
~~~
void f(int year)
{
char* x[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
char* y[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
int n = year - 1984;
while(n<0) n += 60;
printf("%s%s\n", x[_______], y[_______]);
}
int main(int argc, char* argv[])
{
f(1911);
f(1970);
f(2012);
return 0;
}
~~~
這道題,最近的一個甲午年(就是對10或者12取模都為0)是1984年,就以它為標準,求模就可以了,
題目中也有對給出的年份小于1984年的處理(n+=60),這題難度,應該很小了。。。
答案: ?n%10 ? ?n%12?
②歌賽新規
歌手大賽的評分規則一般是去掉一個最高分,去掉一個最低分,剩下的分數求平均。當評委較少的時候,如果我們只允許去掉一個分數,該如何設計規則呢?
有人提出:應該去掉與其余的分數平均值相差最遠的那個分數。即“最離群”的分數。
以下的程序用于實現這個功能。其中x存放所有評分,n表示數組中元素的個數。函數返回最“離群”的那個分數值。
~~~
double score(double x[], int n)
{
int i,j;
double dif = -1;
double bad;
for(i=0; i<n; i++)
{
double sum = 0;
for(j=0; j<n; j++)
{
if(________) sum += x[j];
}
double t = x[i] - sum / (n-1);
if(t<0) t = -t;
if(t>dif)
{
dif = t;
bad = x[i];
printf("%d, %f\n", i, x[i]);
}
}
return bad;
}
~~~
題目很簡單,就是求最離群的數字,如果讓我打代碼,我猜可能是求最大和最小的,然后剩下的求平均,通過它們之間的差值來查找,這題目的做法,應該是,計算n-1個平均值,來比較,所以兩層循環,
第一層,計算2~n的,第二層計算1,3~n。。。。所以if里應該是去除掉當前循環的i,對應的值再求和
答案:i!=j
③概率問題
某個袋子中有紅球m個,白球n個。現在要從中取出x個球。那么紅球數目多于白球的概率是多少呢?
下面的代碼解決了這個問題。其中的y表示紅球至少出現的次數。
這與前文的問題是等價的。因為如果取30個球,要求紅球數大于白球數,則等價于至少取出16個紅球。
~~~
/*
m: 袋中紅球的數目
n: 袋中白球的數目
x: 需要取出的數目
y: 紅球至少出現的次數
*/
double pro(int m, int n, int x, int y)
{
if(y>x) return 0;
if(y==0) return 1;
if(y>m) return 0;
if(x-n>y) return 1;
double p1 = _______________________;
double p2 = _______________________;
return (double)m/(m+n) * p1 + (double)n/(m+n) * p2;
}
~~~
剛開始,我以為要直接求出來p1,p2,但是后來一想,不對啊,代碼填空題,只給了一個函數,沒有給主函數那些,肯定是遞歸了,再加上題目中給了遞歸終止的條件,所以肯定是遞歸了。
知道了遞歸以后就很簡單了:模擬拿球情況,要么拿了一個紅球,要么拿了一個白球。
答案:pro(m-1,n,x-1,y-1) ?pro(m,n-1,x-1,y) ?
④交換變量
如果要把兩個整型變量a、b的值交換,一般要采用一個中間變量做過渡,
但也可以在不借助任何其它變量的情況下完成。
a = _________;
b = _________;
a = _________;
這道題目,有很多種解法,我這里就給出兩種吧,一個是用位運算— ?^
^(異或)是將兩邊數都轉換成2進制,然后異或,
第一種方法:a=a^b,b=a^b,a=a^b
第二種方法就是 ?a=a+b,b=a-b,a=a-b
⑤考拉茲猜想
“考拉茲猜想”(又稱3n+1猜想、角谷猜想、哈塞猜想、烏拉姆猜想或敘拉古猜想) 和“哥德巴赫猜想”一樣目前還沒有用數學方法證明其完全成立。在1930年,德國漢堡大學的學生考拉茲,曾經研究過這個猜想,因而得名。在1960年,日本人角谷靜夫也研究過這個猜想。
該猜想的敘述十分簡單:從任何一個正整數n出發,若是偶數就除以2,若是奇數就乘3再加1,如此繼續下去,經過有限步驟,總能得到1。例如:
17-52-26-13-40-20-10-5-16-8-4-2-1
該猜想雖然沒有完全證明,但用計算機驗證有限范圍的數字卻十分容易。
~~~
for(int n=2; n<=10000; n++)
{
int m = n;
for(;;)
{
if(____________)
m = m / 2;
else
m = m * 3 + 1;
if( m == 1 )
{
printf("%d ok! \n", n);
break;
}
}
};
~~~
這道題,額,看起來很高端大氣上檔次,猜想也很厲害的樣子,但是空就有些。。。
根據題目所給,遇到偶數時 ?該數除以2,所以答案就是判斷m是不是偶數: m%2==0
⑥利息計算
小李年初在銀行存款1千元(一年定期)。他計劃每年年底取出100元救助失學兒童。
假設銀行的存款利率不變,年利率為3%,年底利息自動計入本金。下面的代碼計算5年后,該賬戶上有多少存款。
~~~
double money = 1000;
int n = 5;
int i;
for(i=0; i<n; i++)
{
money = _______________;
money -= 100;
}
printf("%.2f\n", money);
~~~
這道題啊,唉,每年年末,要把本金加上利息都算上再存進去,扣的錢就不需要減了,下面代碼幫助你減了。
答案:money=money*1.03
- 前言
- 入門訓練四道題
- 基礎練習之閏年判斷——BASIC-1
- 基礎練習之01字串——BASIC-2
- 基礎練習之字母圖形——BASIC-3
- 基礎練習之數列特征——BASIC-4
- 基礎練習之查找整除——BASIC-5
- 基礎練習之楊輝三角形——BASIC-6
- 基礎練習之特殊的數字——BASIC-7
- 基礎練習之回文數——BASIC-8
- 基礎練習之特殊回文數——BASIC-9
- 基礎練習之十進制轉十六進制——BASIC-10
- 基礎練習之十六進制轉十進制——BASIC-11
- 基礎練習之十六進制轉八進制——BASIC-12
- 基礎練習之數列排序——BASIC-13
- 算法訓練之區間K大數查詢——ALGO-1
- 算法訓練之最大最小公倍數——ALGO-2
- 藍橋杯-代碼填空之一
- 藍橋杯-代碼填空之二
- 藍橋杯-代碼填空之三
- 藍橋杯-代碼填空之精品
- 藍橋杯-歷屆試題之翻硬幣
- 藍橋杯-代碼填空之四
- 藍橋杯-結果填空題
- 藍橋杯-結果填空之排座位
- 藍橋杯-歷屆試題之大臣的旅費