当前位置:文档之家› 干 支 法 纪 年 算 法

干 支 法 纪 年 算 法

蓝桥杯-代码填空之二
干支纪年法—歌赛新规则—红球多于白球的概率—交换变量—考拉兹猜想—利息计算
①干支纪年法
在我国古代和近代,一直采用干支法纪年。

它采用10天干和12地支配合,一个循环周期为60年。

10天干是:甲,乙,丙,丁,戊,己,庚,辛,壬,癸
12地支是:子,丑,寅,卯,辰,巳,午,未,申,酉,戌,亥
如果某年是甲子,下一年就是乙丑,再下是丙寅,.癸酉,甲戌,乙亥,丙子,.
总之天干、地址都是循环使用,两两配对。

今年(2012)是壬辰年,1911年辛亥革命
下面的代码根据公历年份输出相应的干支法纪年。

已知最近的甲子年是1984年。

void f(int year)
char* x[] = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
char* y[] = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
int n = year - 1984;
while(n0) n += 60;
printf("%s%s", 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; in; i++)
double sum = 0;
for(j=0; jn; j++)
if(________) sum += x[j];
double t = x[i] - sum - (n-1);
if(t0) t = -t;
if(tdif)
bad = x[i];
printf("%d, %f", 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(yx) return 0;
if(y==0) return 1;
if(ym) return 0;
if(x-ny) 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 * 3 + 1;
if( m == 1 )
printf("%d ok! ", n);
这道题,额,看起来很高端大气上档次,猜想也很厉害的样子,但是空就有些。

根据题目所给,遇到偶数时 ?该数除以2,所以答案就是判断m是不是偶数: m%2==0
⑥利息计算
小李年初在银行存款1千元(一年定期)。

他计划每年年底取出100元救助失学儿童。

假设银行的存款利率不变,年利率为3%,年底利息自动计入本金。

下面的代码计算5年后,该账户上有多少存款。

double money = 1000;
int n = 5;
for(i=0; in; i++)
money = _______________;
money -= 100;
printf("%.2f", money);
这道题啊,唉,每年年末,要把本金加上利息都算上再存进去,扣的钱就不需要减了,下面代码帮助你减了。

答案:money=money*1.03
刚开始,我以为要直接求出来p1,p2,但是后来一想,不对啊,代码填空题,只给了一个函数,没有给主函数那些,肯定是递归了,再加上题目
中给了递归终止的条件,所以肯定是递归了。

如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出。

相关主题