zoukankan      html  css  js  c++  java
  • 百度在线考试编程题:股神小赛

    小赛买股票了,本金为1元,第1天过后不变还是1元,从第二天开始涨1天跌1天,涨2天跌1天,涨3天跌1天,涨4天跌1天,……每次涨幅或跌幅都是1元,求第n天他还有多少钱(大致描述了下题目,具体我也不知道了)

    自己比较笨的方法做的,相对高手来说代码量比较大(水平太low,大家见谅)。代码如下:

     1 /*********计算股价*********/
     2 /*********根据规律,将天数分成段数,计算股价和*********/
     3 #include <stdio.h>
     4 #define Base 1
     5 
     6 int days_section(int);
     7 int judge_sec(int);
     8 int sum_money_section(int);
     9 int sum_money_total(int);
    10 
    11 int main(void)
    12 {
    13     int days;
    14     printf("Please enter days:
    ");
    15     while (scanf("%d", &days) == 1)
    16     {
    17         printf("money: %d
    
    ",sum_money_total(days));
    18         printf("Please enter another days(q to qiut):
    ");
    19     }
    20 }
    21 
    22 /****************计算前n段的总天数:输入段数,输出天数*******************/
    23 int days_section(int n)    //第1段2天;第2段2+3天;第3段2+3+4天;……
    24 {
    25     int i,num=0;
    26     for(i=1; i<=n; i++)
    27         num+=(i+2-1);
    28     return num;
    29 }
    30 
    31 /*****************判断一个天数days对应的段数*******************/
    32 int judge_sec(int n)    //前5段共20天,则第21天属于第6段
    33 {
    34     int i;
    35     for(i=1; days_section(i)<=n; i++);
    36     return i;
    37 }
    38 
    39 /********************计算前n段区间的股价改变值********************/
    40 int sum_money_section(int n)//前1段1+(0)¥,前2段1+(0+1)¥,前3段1+(0+1+2)¥,前4段1+(0+1+2+3)¥……
    41 {
    42     int i,sum=0;
    43     for(i=1; i<=n; i++)
    44         sum += (i-1);
    45     return sum+1;
    46 }
    47 
    48 /********************计算总股价********************/
    49 int sum_money_total(int days)
    50 {
    51     int sections, days_sec, days_left, money;
    52 
    53     if(days == 0 || days == 1)
    54         money = Base + 0;    //第零天或第一天无变化,即增长为0
    55     else
    56     {
    57 
    58     sections = judge_sec(days) - 1;        //多少段
    59     days_sec = days_section(sections);    //(这多少段是多少天)
    60     days_left = days - days_sec;        //余几天
    61 
    62     if(days_left == 0 || days_left == 2)
    63         money = sum_money_section(sections) + Base;                        //当余下的天数为0或者2时,总价=多少段的钱+本金(余0天和余2天都是不亏不赚)
    64     else if(days_left == 1)
    65         money = sum_money_section(sections) - 1 + Base;                    //当余下的天数为1时,总价=多少段的钱+本金-1(余1天的算亏一元)
    66     else 
    67         money = sum_money_section(sections) + (days_left-2) * 1 + Base;    //当余下的天数大于2时,总价=多段的钱+本金+(余的天数-2)*1
    68 
    69     }
    70     return money;
    71 }

    我就是找规律,然后分成整段和一个余数,其中每段都是以跌的那一天开始的,到下一次跌之前结束。总价 =  整段的钱(这个比较好算,公差为1的等差数列和)  +   余数的钱(分三种情况计算下就行)。

    有时间的话这题还得参考参考高手的代码,好像很简洁。

    (PS:这题完全是自己想的,做出来之后再看了看别人的做法。似乎体会到了“程序员很重要的能力之一就是把问题抽象化”这句话的含义了,加油!!) 

  • 相关阅读:
    Designing With Web Standard(一)
    再听姜育恒
    终于找到Effective C Sharp电子版了
    继续下一个题目
    想做就做,要做得漂亮
    空悲还是空杯
    整理,中庸
    分布式系统设计随想
    日志log4
    log4net更换目录
  • 原文地址:https://www.cnblogs.com/TomLily/p/5907751.html
Copyright © 2011-2022 走看看