一、写一个程序,语言不限,打印出100的阶乘(即1*2*3*…*100)的精确数值结果(不能是浮点数)。如5的阶乘是1*2*3*4*5=120。  二、写一个程序,语言不限,能将人民币金额从阿拉伯数字转换为大写汉字表示。例如,把1234.56转换为壹仟贰佰叁拾肆圆零伍角陆分。  三、在SQL Server 数据库中,有一个表StudentAchievement(学生成绩),它有三个字段:StudentID(varchar(8),学生编号),CourseID(varchar(10),课程编号),Achievement(int ,成绩),写一条SQL语句,筛选出每门课程的前两名的学生编号,课程编号,成绩并排序。  四、编程实现求出若干个整数之和为500的连续整数(如98,99,100,101,102),所有组合。

解决方案 »

  1.   

    第一题在92年我们QBASIC老师上课的时候因为看到大家都不重视这门选修课的时候,出过这个题目难过我们,意在告诉大家,语言不是关键,算法不好,任何语言都不能直接做出正确答案,而任何语言,配合正确的算法,都可解出这个题:用数组。第二题我在早期用foxpro写的MIS中作过,你给的用例本身就是错误的:把1234.56转换为壹仟贰佰叁拾肆圆零伍角陆分,应该是壹仟贰佰叁拾肆圆伍角陆分,小数位如果不是0,或者角位不是0都不需要加"零"字。第三题应该用一条SQL语句解不出来的第四题用穷举法来算吧,暂时想不出好的算法。
      

  2.   

    using System;namespace HaiNuo
    {
        /*****************************************************************************************
         * 类名:DecimalToUpper                                             *
         * 功能:把金额数据从小写转换为大写                              *
         * 限制条件:金额小于一万亿,且少于两位小数                  *
         * 作者:雷俊强 [email protected]                      *
         * 日期:2003-5-6                              *
         * 用法:DecimalToUpper x = new DecimalToUpper();                  *
         *       this.textBox2.Text = x.ToUpper(d);                      *
         *       欢迎下载、使用                                                                  *
         * FOR my wife and my son                                                                *
         *****************************************************************************************/
        public class DecimalToUpper
        {
            public DecimalToUpper()
            {
                //
                // TODO: 在此处添加构造函数逻辑
                //
            }        /// <summary>
            /// 小写金额转换为大写金额,其他条件:金额小于一万亿,最多两位小数
            /// </summary>
            /// <param name="d">源金额,d 《 1000000000000.00(一万亿),且最多两位小数 </param>
            /// <returns>结果,大写金额</returns>
            public string ToUpper(decimal d)
            {
                if (d == 0)
                    return "零元整";

                string je = d.ToString("####.00");
                if (je.Length > 15)
                    return "";
                je = new String('0',15 - je.Length) + je; //若小于15位长,前面补0            string stry = je.Substring(0,4); //取得'亿'单元
                string strw = je.Substring(4,4); //取得'万'单元
                string strg = je.Substring(8,4); //取得'元'单元
                string strf = je.Substring(13,2); //取得小数部分

                string str1 = "",str2 = "",str3 = "";            str1 = this.getupper(stry,"亿"); //亿单元的大写
                str2 = this.getupper(strw,"万"); //万单元的大写
                str3 = this.getupper(strg,"元"); //元单元的大写
                string str_y = "", str_w = "";
                if (je[3] == '0' || je[4] == '0') //亿和万之间是否有0
                    str_y = "零";
                if (je[7] == '0' || je[8] == '0') //万和元之间是否有0
                    str_w = "零";            string ret = str1 + str_y + str2 + str_w + str3; //亿,万,元的三个大写合并            for (int i = 0 ;i < ret.Length;i++) //去掉前面的"零"
                {
                    if (ret[i] != '零')
                    {
                        ret = ret.Substring(i);
                        break;
                    }            }
                for (int i = ret.Length - 1;i > -1 ;i--) //去掉最后的"零"
                {
                    if (ret[i] != '零')
                    {
                        ret = ret.Substring(0,i+1);
                        break;
                    }
                }

                if (ret[ret.Length  - 1] != '元') //若最后不位不是'元',则加一个'元'字
                    ret = ret + "元";            if (ret == "零零元") //若为零元,则去掉"元数",结果只要小数部分
                    ret = "";

                if (strf == "00") //下面是小数部分的转换
                {
                    ret = ret + "整";
                }
                else
                {
                    string tmp = "";
                    tmp = this.getint(strf[0]);
                    if (tmp == "零")
                        ret = ret + tmp;
                    else
                        ret = ret + tmp + "角";                tmp = this.getint(strf[1]);
                    if (tmp == "零")
                        ret = ret + "整";
                    else
                        ret = ret + tmp + "分";
                }            if (ret[0] == '零')
                {
                    ret = ret.Substring(1); //防止0.03转为"零叁分",而直接转为"叁分"
                }            return  ret; //完成,返回
            }
            /// <summary>
            /// 把一个单元转为大写,如亿单元,万单元,个单元
            /// </summary>
            /// <param name="str">这个单元的小写数字(4位长,若不足,则前面补零)</param>
            /// <param name="strDW">亿,万,元</param>
            /// <returns>转换结果</returns>
            private string getupper(string str,string strDW)
            {
                if (str == "0000")
                    return "";            string ret = "";
                string tmp1 = this.getint(str[0]) ;
                string tmp2 = this.getint(str[1]) ;
                string tmp3 = this.getint(str[2]) ;
                string tmp4 = this.getint(str[3]) ;
                if (tmp1 != "零")
                {
                    ret = ret + tmp1 + "仟";
                }
                else
                {
                    ret = ret + tmp1;
                }            if (tmp2 != "零")
                {
                    ret = ret + tmp2 + "佰";
                }
                else
                {
                    if (tmp1 != "零") //保证若有两个零'00',结果只有一个零,下同
                        ret = ret + tmp2;
                }            if (tmp3 != "零")
                {
                    ret = ret + tmp3 + "拾";
                }
                else
                {
                    if (tmp2 != "零")
                        ret = ret + tmp3;
                }            if (tmp4 != "零")
                {
                    ret = ret + tmp4 ;
                }

                if (ret[0] == '零') //若第一个字符是'零',则去掉
                    ret = ret.Substring(1);
                if (ret[ret.Length - 1] == '零') //若最后一个字符是'零',则去掉
                    ret = ret.Substring(0,ret.Length - 1);            return ret + strDW; //加上本单元的单位

            }
            /// <summary>
            /// 单个数字转为大写
            /// </summary>
            /// <param name="c">小写阿拉伯数字 0---9</param>
            /// <returns>大写数字</returns>
            private string getint(char c)
            {
                string str = "";
                switch ( c )
                {
                    case '0':
                        str = "零";
                        break;
                    case '1':
                        str = "壹";
                        break;
                    case '2':
                        str = "贰";
                        break;
                    case '3':
                        str = "叁";
                        break;
                    case '4':
                        str = "肆";
                        break;
                    case '5':
                        str = "伍";
                        break;
                    case '6':
                        str = "陆";
                        break;
                    case '7':
                        str = "柒";
                        break;
                    case '8':
                        str = "拐";
                        break;
                    case '9':
                        str = "玖";
                        break;
                }
                return str;
            }
        }
    }
      

  3.   

    1.  
        public void main()
        {    
           
           for(int i=0 ;i<100 ;i++)
           {
              DoPrint(i);    
           }
        }    private void DoPrint(int i)
        {
           long int j = 1;
           for(int p=1;p<=i;p++)
           {
               j = j*p;
            }
            printf(j.ToString());
         }
      

  4.   

    select top 2 StudentID,CourseID,Achievement from StudentAchievement Order by Achievement DESC
      

  5.   


    这么简单的考题啊,什么公司啊
    如果是Delphi,半个小时足够了,可惜是C# 啊顶
      

  6.   

    1、打印出100的阶乘using System;namespace jc
    {
    /// <summary>
    /// 打印出100的阶乘。
    /// </summary>
    class Class1
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    float sum=0;
    for(int i=1;i<20;i++)
    {
    float temp = 0; for(int j=i+1;j<=20;j++)
    {
    if(i!=1)
    {
    temp = sum*j;

    }
    else
    {
    temp = i*j;
    }
    break;
    }
    sum = temp; }
    Console.WriteLine("100的阶乘="+sum.ToString());
    }
    }
    }
    ---------------------------------------
    结果:100的阶乘=2.432902E+182.提供一个思路(c#)
    首先,写一个类,这个类主要实现数字于大写汉字的对照,当传入数字时返回相应的汉字。
    如:1234.56。
    先把这个数字分为两部分,即整数和小数部分。然后依次判断整数部分和小数部分(Split())。如1234,首先判断出是千位数,从高位开始,“1”,可转换成“壹仟”,其他实现类似(小数部分同理)。完成转换后返回汉字字符串。
      

  7.   

    呵呵,精确阶乘的程序来了: static void Main(string[] args)
    {
    int[] result = new int[1000]; //大约可以计算450的阶乘!
    result[0]=1;  //先初始1,真正计算从2的阶乘开始
    int pointFrist=0; //计算阶乘
    for(int i=2;i<=100;i++)
    {
    //先按位计算阶乘;
    for(int j=0;j<1000;j++)
    {
    result[j] *= i;
    }
    //整理数组
    for(int j=0;j<1000;j++)
    {
    if(result[j]>9)
    {
    result[j+1] += (int)result[j]/10;
    result[j] %= 10;
    }
    }
    }
    //找到第一个有效位
    for(int i=999;i>0;i--)
    {
    if(result[i]>0) 
    {
    pointFrist = i;
    break;
    } }
    //显示结果
    for(int i=pointFrist;i>=0;i--)
    Console.Write(result[i]);
    }
      

  8.   

    整理下,程序并没有优化,但是获得的是精确的阶乘:static void Main(string[] args)                          
    {                                                        
    int[] result = new int[1000]; //大约可以计算450的阶乘!
    result[0]=1;  //先初始1,真正计算从2的阶乘开始         
    int pointFrist=0;                                      
                                                             
    //计算阶乘                                             
    for(int i=2;i<=100;i++)                                
    {                                                      
    //先按位计算阶乘;                                   
    for(int j=0;j<1000;j++)                              
    {                                                    
    result[j] *= i;                                    
    }                                                    
    //整理数组                                           
    for(int j=0;j<1000;j++)                              
    {                                                    
    if(result[j]>9)                                    
    {                                                  
    result[j+1] += (int)result[j]/10;                
    result[j] %= 10;                                 
    }                                                  
    }                                                    
    }                                                      
    //找到第一个有效位                                     
    for(int i=999;i>0;i--)                                 
    {                                                      
    if(result[i]>0)                                      
    {                                                    
    pointFrist = i;                                    
    break;                                             
    }                                                    
                                                             
    }                                                      
    //显示结果                                             
    for(int i=pointFrist;i>=0;i--)                         
    Console.Write(result[i]);                            
    }
      

  9.   

    第四题也比较简单,也帮你做出来吧!static void Main(string[] args)
    {
    for(int i=1;i<500;i++)
    {
    int temp=i;
    int point=0;
    bool hasResult = false;
    for(int j=(i+1);j<500;j++)
    {
    temp+=j;
    if(temp==500)
    {
    hasResult = true;
    point = j;
    break;
    }
    }
    if(hasResult)
    {
    Console.Write(i);
    for(int k=(i+1) ;k<=point ; k++)
    {
    Console.Write("+"+k);
    }
    Console.WriteLine("=500");
    }
    }
    }
      

  10.   

    第一题可以考虑有链表,只要内存够,就可以算任意数的接乘。但效率没有数组高。
    还可以在数学上优化阶乘算法,以前见过特牛的,100万的接乘只用几秒。直接乘就溢出啦~~~二 没什么可说的~三 一条SQL能写出来!四 若干整数之和,首先就有{500} , {-499,500}  哈哈 
      

  11.   

    第三题:
    Select * From StudentAchievement S1
     Where Achievement = ( Select Max( Achievement ) From StudentAchievement  Where CourseID = S1.CourseID Group By CourseID ) 
    Or  Achievement = ( Select Max( Achievement )  From StudentAchievement A  
    Where Achievement <= ( Select Max( Achievement ) From StudentAchievement Where  CourseID = A.CourseID And StudentID <> A.StudentID)   And  A.CourseID = S1.CourseID Group By CourseID )  Order By CourseID asc , Achievement desc
      

  12.   

    晕,CSDN贴源码还是不好用,再整理下,程序并没有优化,但是获得的是精确的阶乘:static void Main(string[] args)
    {
    int[] result = new int[1000]; //大约可以计算450的阶乘!
    result[0]=1;  //先初始1,真正计算从2的阶乘开始
    int pointFrist=0;
     
    //开始计算阶乘
    for(int i=2;i<=100;i++)
    {
    //先按位计算阶乘;原理是123*n = 100*n + 20*n +3*n.....
    for(int j=0;j<1000;j++)
    {
    result[j]*=i;
    }
    //整理数组,手工进位;
    for(int j=0;j<1000;j++)
    {
    if(result[j]>9)  //只保留个位,十位以上前进位
    {
    //十位以上加到前一位
    result[j+1]+=(int)result[j]/10; 
    //保留个位
    result[j]%=10;
    }
    }
    }
    //找到计算结果中的第一个有效位,用于显示
    //自然顺序计算,显示的时候倒过来
    for(int i=999;i>0;i--)
    {
    if(result[i]>0) 
    {
    pointFrist=i;
    break;  //找到第一个有效数纪录下来后退出
    }
    }                                                      
    //显示结果,倒序显示数组内容
    for(int i=pointFrist;i>=0;i--)
    Console.Write(result[i]);
    }
      

  13.   

    第四题如果连负数也考虑的话,把for(int j=(i+1);j<500;j++)换成:for(int i=-500;i<500;i++)结果:-97+-96+-95+-94+-93+-92+-91+-90+-89+-88+-87+-86+-85+-84+-83+-82+-81+-80+-79+-78+-77+-76+-75+-74+-73+-72+-71+-70+-69+-68+-67+-66+-65+-64+-63+-62+-61+-60+-59+-58+-57+-56+-55+-54+-53+-52+-51+-50+-49+-48+-47+-46+-45+-44+-43+-42+-41+-40+-39+-38+-37+-36+-35+-34+-33+-32+-31+-30+-29+-28+-27+-26+-25+-24+-23+-22+-21+-20+-19+-18+-17+-16+-15+-14+-13+-12+-11+-10+-9+-8+-7+-6+-5+-4+-3+-2+-1+0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100+101+102=500-58+-57+-56+-55+-54+-53+-52+-51+-50+-49+-48+-47+-46+-45+-44+-43+-42+-41+-40+-39+-38+-37+-36+-35+-34+-33+-32+-31+-30+-29+-28+-27+-26+-25+-24+-23+-22+-21+-20+-19+-18+-17+-16+-15+-14+-13+-12+-11+-10+-9+-8+-7+-6+-5+-4+-3+-2+-1+0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66=500-7+-6+-5+-4+-3+-2+-1+0+1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32=5008+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32=50059+60+61+62+63+64+65+66=50098+99+100+101+102=500
      

  14.   

    呵呵,贴错,是:for(int i=1;i<500;i++)换成for(int i=-500;i<500;i++)
      

  15.   

    看起来最后一个最简单,所以回答这个争点分。----------------------------------------------
    1,假设连续n个数的和是500.那么n必须是奇数。(因为连续偶数个整数的和是奇数).
    2,那么假设中间的那个数是m,那么这个数列就是
    m-(n-1)/2, ...., m-1,m,m+1,...,m+(n-1)/2.它们的和是m*n=500
    3, 现在题目变成这样:
    1)n为奇数,m*n=500
    2)m-(n-1)/2 > 0
    求m,n. 求出m,n,数列就出来了。编这样一个程序,都会吧。
      

  16.   

    TheAres(班门斧) :第一个论点出错了.1,假设连续n个数的和是500.那么n必须是奇数。(因为连续偶数个整数的和是奇数).59+60+61+62+63+64+65+66=500 ,8个连续数。
      

  17.   

    hexinyu(新宇),你的程序有两个问题:1、限制在1万亿内有问题,国民生产总值会超过万亿的,这样的程序是有缺陷的。2、没有试验你的程序,但是大概看了看,把100 0000 0000.01代入得到的答案不会是:壹百亿元零壹分的。
      

  18.   

    Jamestan(情商蛋蛋):哈哈,的确错了。那就再加上偶数的分析,算法上还是可以用单层循环来完成。谢谢啊。
      

  19.   

    TheAres(班门斧),我给出的双层循环的解法,看看谁能做出给优化的了static void Main(string[] args)
    {
    for(int i=-500;i<500;i++)
    {
    int temp=i;
    int point=0;
    bool hasResult = false;
    for(int j=(i+1);j<500;j++)
    {
    temp+=j;
    if(temp>500) break;
    if(temp==500)
    {
    hasResult = true;
    point = j;
    break;
    }
    }
    if(hasResult)
    {
    Console.Write(i);
    for(int k=(i+1) ;k<=point ; k++)
    {
    Console.Write("+"+k);
    }
    Console.WriteLine("=500\n");
    }
    }
    }
      

  20.   

    我的代码,答案和算法。 public static void Main()
    {
    int m;
    int r = 1000;
    int n =  1;
    int loopNum = 0; while( r > n )
    {
    loopNum++;
    n++;
    m = ( 1000 / n + n - 1 ) / 2; if ( r % n == 0 &&  ( 1000 / n + n - 1) % 2 == 0  && m - n + 1 > 0 )
    {
    Console.Write( "500: " );

    for( int t = m - n + 1; t <= m; t ++ ) 
    {
    Console.Write( "{0} ", t );
    }
    Console.WriteLine();

    r = r / n;
    }
    }
    Console.WriteLine( "Total Loop {0}", loopNum );
    Console.ReadLine();
    }500: 98 99 100 101 102
    500: 59 60 61 62 63 64 65 66
    500: 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
    Total Loop 24假设最后一个是m,数组个数是n.第一个数是m-n+1.它们的和是(m-n+1+m)*n = 500,m=( 1000 / n + n - 1 ) / 2; 要求m是整数,m-n+1>0.
      

  21.   

    TheAres(班门斧) ,强!学习中,这样效率高出很多啊!
      

  22.   

    conan19771130(努力工作,研究ce),可以写出可用的,可惜写不出漂亮的,所以就不献丑了。
      

  23.   

    给你我的阶乘计算器,呵呵。这个是算法实习的时候虎弄老师的,我们老师不会.net。晕!
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;namespace 大数阶乘
    {
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.Label label2;
    private System.Windows.Forms.TextBox textBox1;
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Label label3;
    private System.Windows.Forms.RichTextBox richTextBox1;
    private System.Windows.Forms.Label label4;
    private System.Windows.Forms.Label label5;
    private System.Windows.Forms.Label label6;
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public Form1()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent(); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null) 
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
    this.label1 = new System.Windows.Forms.Label();
    this.label2 = new System.Windows.Forms.Label();
    this.textBox1 = new System.Windows.Forms.TextBox();
    this.button1 = new System.Windows.Forms.Button();
    this.label3 = new System.Windows.Forms.Label();
    this.richTextBox1 = new System.Windows.Forms.RichTextBox();
    this.label4 = new System.Windows.Forms.Label();
    this.label5 = new System.Windows.Forms.Label();
    this.label6 = new System.Windows.Forms.Label();
    this.SuspendLayout();
    // 
    // label1
    // 
    this.label1.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
    this.label1.Location = new System.Drawing.Point(96, 16);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(168, 23);
    this.label1.TabIndex = 0;
    this.label1.Text = "大整数阶乘计算器";
    // 
    // label2
    // 
    this.label2.Location = new System.Drawing.Point(16, 72);
    this.label2.Name = "label2";
    this.label2.Size = new System.Drawing.Size(72, 16);
    this.label2.TabIndex = 1;
    this.label2.Text = "输入数据:";
    // 
    // textBox1
    // 
    this.textBox1.ImeMode = System.Windows.Forms.ImeMode.Disable;
    this.textBox1.Location = new System.Drawing.Point(88, 67);
    this.textBox1.Name = "textBox1";
    this.textBox1.Size = new System.Drawing.Size(120, 21);
    this.textBox1.TabIndex = 2;
    this.textBox1.Text = "";
    // 
    // button1
    // 
    this.button1.Location = new System.Drawing.Point(248, 64);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(64, 24);
    this.button1.TabIndex = 3;
    this.button1.Text = "计算";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    // 
    // label3
    // 
    this.label3.Location = new System.Drawing.Point(16, 112);
    this.label3.Name = "label3";
    this.label3.Size = new System.Drawing.Size(72, 16);
    this.label3.TabIndex = 4;
    this.label3.Text = "计算结果:";
    // 
    // richTextBox1
    // 
    this.richTextBox1.Location = new System.Drawing.Point(88, 112);
    this.richTextBox1.Name = "richTextBox1";
    this.richTextBox1.Size = new System.Drawing.Size(256, 184);
    this.richTextBox1.TabIndex = 5;
    this.richTextBox1.Text = "";
    // 
    // label4
    // 
    this.label4.Location = new System.Drawing.Point(16, 320);
    this.label4.Name = "label4";
    this.label4.Size = new System.Drawing.Size(80, 16);
    this.label4.TabIndex = 6;
    this.label4.Text = "计算结果有:";
    // 
    // label5
    // 
    this.label5.Location = new System.Drawing.Point(96, 320);
    this.label5.Name = "label5";
    this.label5.Size = new System.Drawing.Size(48, 16);
    this.label5.TabIndex = 7;
    // 
    // label6
    // 
    this.label6.Location = new System.Drawing.Point(144, 320);
    this.label6.Name = "label6";
    this.label6.Size = new System.Drawing.Size(32, 16);
    this.label6.TabIndex = 8;
    this.label6.Text = "位。";
    // 
    // Form1
    // 
    this.AcceptButton = this.button1;
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(376, 350);
    this.Controls.Add(this.label6);
    this.Controls.Add(this.label5);
    this.Controls.Add(this.label4);
    this.Controls.Add(this.richTextBox1);
    this.Controls.Add(this.label3);
    this.Controls.Add(this.button1);
    this.Controls.Add(this.textBox1);
    this.Controls.Add(this.label2);
    this.Controls.Add(this.label1);
    this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
    this.Name = "Form1";
    this.Text = "C#小程序";
    this.ResumeLayout(false); }
    #endregion /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread] static void Main() 
    {
    Application.Run(new Form1());
    }
    public void GetValue()
    {
    int[] arr=new int[100000];
    int m,i,j,c,t;
         if(int.Parse(textBox1.Text)<2||int.Parse(textBox1.Text)>10000)
    {
    MessageBox.Show("请输入一个大于1的数!");
    this.textBox1.Focus();
    this.textBox1.SelectionStart=0;
    this.textBox1.SelectionLength=textBox1.TextLength;
    } arr[0]=1; m=1;
    for(i=2;i<=int.Parse(textBox1.Text);i++)
    {
    for(c=0,j=0;j<m;j++)
    {
    t=arr[j]*i+c;
    arr[j]=t%10;
    c=t/10;
    }
    while(c!=0)
    {
    arr[m++]=c%10;
    c/=10;
    }
    }
    string temp="";
    string num="";
    int n=0;
    for(i=m-1;i>=0;i--)
    {
    temp+=arr[i];
    richTextBox1.Text=temp;
    n++; }
    num+=n;
    label5.Text=num;

    } private void button1_Click(object sender, System.EventArgs e)
    {
    try
    {
    GetValue();
    }
    catch
    {
    MessageBox.Show("请输入一个正整数!");
    this.textBox1.Focus();
    this.textBox1.SelectionStart=0;
    this.textBox1.SelectionLength=textBox1.TextLength;
    }
    } }
    }
      

  24.   

    TO TheAres(班门斧):
    真难得一见啊
    不过你的程序没有考虑负数哈
      

  25.   

    Kitson对于有关SQL子句的答案很对,但不知是否考虑要求找出某一课程的前3名,或更多时的情况?
      

  26.   

    第一题就是个高精乘法嘛,有什么难的
    第二题考虑得多一些,代码长些的那种题就是了
    第三题我没学过sql
    第四题可以用个DFS,就是深度优先搜索,然后做下剪枝处理,速度应该还可以
      

  27.   


    using System;class A
    {
    public static void Main(string[] argv)
    {
    DateTime t1 = DateTime.Now;
    BigFact( int.Parse(argv[0]));
    DateTime t2 = DateTime.Now;
    TimeSpan ts = t2 - t1;
    Console.WriteLine( "Run time {0} ms", ts.Milliseconds  );
    } public static void BigFact( int n )
    {
    int length = (int) (Math.Log10( 2 * Math.PI ) / 2 + Math.Log10( n ) / 2
    + n * ( Math.Log10( n ) - Math.Log10( Math.E ) ) ) + 1;
    Console.WriteLine( "Total Length:{0}", length );
    int currentLength = 1;
    int beginPoint = 0;
    UInt64[] result = new ulong[ length ];
    UInt64[] carry = new UInt64[ length ]; result[ 0 ] = 1; const UInt64 BASE10 = 10000000000;
    for( UInt64 i = 2; i <= (UInt64) n; i++ )
    {
    for( int j = beginPoint; j < currentLength; j++ )
    {
    result[ j ] = result[ j ] * i + carry[ j ];
    carry[ j ] = 0;
    if ( result[ j ]  > BASE10 )
    {
    carry[ j + 1 ] = result[ j ] / BASE10;
    result[ j ] = result[ j ] % BASE10;
    if ( result[ j ] == 0 ) beginPoint++;
    }
    }
    if ( carry[ currentLength ] > 0 )
    {
    result[ currentLength ] = carry[ currentLength ];
    carry[ currentLength ] = 0;
    currentLength++;
    }
    } for( int i = currentLength - 1; i >= 0; i-- )
    Console.Write( "{0} ", result[ i ] > 0? result[ i ].ToString() : "0000000000" );
    Console.WriteLine();

    }}
    第一题我用了分组的方法,10个整数存一组,末尾0不参加运算(也不完全). 100!用10ms, 1000!用20ms,10000!用433ms,100000!用 539 ms。 (IBM T40P, windows xp, .Net 1.1 )贴出代码来抛砖引玉,看看谁还能写出更快的算法。
      

  28.   

    int f(n)
    {
      if(n=0)
        {
         return 1;
        }
      else
        {
          f(n)=f(n-1)*n
        }
    }
      

  29.   

    我也来顶一下:
    CREATE PROCEDURE dbo.L2U 

    @n_LowerMoney numeric(15,2), 
    @v_TransType int, 
    @RET VARCHAR(200) output 

    AS 
      
    Declare @v_LowerStr VARCHAR(200) -- 小写金额 
    Declare @v_UpperPart VARCHAR(200) 
    Declare @v_UpperStr VARCHAR(200) -- 大写金额 
    Declare @i_I int 
     
    set nocount on 
     
    select @v_LowerStr = LTRIM(RTRIM(STR(@n_LowerMoney,20,2))) --四舍五入为指定的精度并删除数据左右空格 
     
    select @i_I = 1 
    select @v_UpperStr = ''
     
    while ( @i_I <= len(@v_LowerStr)) 
    begin 
         select @v_UpperPart = case substring(@v_LowerStr,len(@v_LowerStr) - @i_I + 1,1) 
                               WHEN  '.' THEN  '元' 
                               WHEN  '0' THEN  '零' 
                               WHEN  '1' THEN  '壹' 
                               WHEN  '2' THEN  '贰' 
                               WHEN  '3' THEN  '叁' 
                               WHEN  '4' THEN  '肆' 
                               WHEN  '5' THEN  '伍' 
                               WHEN  '6' THEN  '陆' 
                               WHEN  '7' THEN  '柒' 
                               WHEN  '8' THEN  '捌' 
                               WHEN  '9' THEN  '玖' 
                               END 
                             + 
                               case @i_I 
                               WHEN  1  THEN  '分' 
                               WHEN  2  THEN  '角' 
                               WHEN  3  THEN  '' 
                               WHEN  4  THEN  '' 
                               WHEN  5  THEN  '拾' 
                               WHEN  6  THEN  '佰' 
                               WHEN  7  THEN  '仟' 
                               WHEN  8  THEN  '万' 
                               WHEN  9  THEN  '拾' 
                               WHEN  10  THEN  '佰' 
                               WHEN  11  THEN  '仟' 
                               WHEN  12  THEN  '亿' 
                               WHEN  13  THEN  '拾' 
                               WHEN  14  THEN  '佰' 
                               WHEN  15  THEN  '仟' 
                               WHEN  16  THEN  '万' 
                               ELSE '' 
                               END 
    select @v_UpperStr = @v_UpperPart + @v_UpperStr 
    select @i_I = @i_I + 1 
    end 
     
    --------print  '//v_UpperStr ='+@v_UpperStr +'//' 
     
    if ( @v_TransType=0 ) 
    begin 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零拾','零') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零佰','零') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零仟','零') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零零零','零') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零零','零') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零角零分','整') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零分','整') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零角','零') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零亿零万零元','亿元') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'亿零万零元','亿元') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零亿零万','亿') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零万零元','万元') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'万零元','万元') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零亿','亿') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零万','万') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零元','元') 
    select @v_UpperStr = REPLACE(@v_UpperStr,'零零','零') 
    end 
     
    -- 对壹元以下的金额的处理 
    if ( substring(@v_UpperStr,1,1)='元' ) 
    begin 
        select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) 
    end 
     
    if (substring(@v_UpperStr,1,1)= '零') 
    begin 
        select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) 
    end 
     
    if (substring(@v_UpperStr,1,1)='角') 
    begin 
        select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) 
    end 
     
    if ( substring(@v_UpperStr,1,1)='分') 
    begin 
        select @v_UpperStr = substring(@v_UpperStr,2,(len(@v_UpperStr) - 1)) 
    end 
     
    if (substring(@v_UpperStr,1,1)='整') 
    begin 
        select @v_UpperStr = '零元整' 
    end 
     
    select @ret=@v_UpperStr 
     
    GO
     
    执行效果:declare @ret varchar(200) 
     
    exec dbo.L2U 567983.897,1,@ret output 
     
    select @ret 
      

  30.   

    TheAres(班门斧)又有好东西了!赞啊!BTW:你是学数学还是计算机专业的?
      

  31.   

    第三题不可以这样吗:
    select top 2 字段1,字段2,字段3 from 表名 group by 课程 order by 成绩
      

  32.   

    private void button1_Click(object sender, System.EventArgs e)
    {
    if(this.textBox1.Text!="")
    {   
                   // MessageBox.Show(txt.ToString());
    // int txt=Int32.Parse(this.textBox2.Text.Trim());

    float chr=1; for(float i=1;i<=float.Parse(this.textBox1.Text.Trim());i++)
    {
      chr=chr*i;

    }
    this.textBox2.Text=chr.ToString();
    }
    else
    {
    MessageBox.Show("请输入数字","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    } private void textBox1_TextChanged(object sender, System.EventArgs e)
    {
    byte[] bye=System.Text.Encoding.ASCII.GetBytes(this.textBox1.Text.Trim());
     int chr=0;
    for(int i=0;i<bye.Length;i++)
    {
      chr=(int)bye[i];
    if(chr>=48 & chr<=57)
    {
      
    }
    else
    {
    MessageBox.Show("请输入数字","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    this.textBox1.Text="";
    }
    }
     }
      

  33.   

    第三题:用了一个stack来作的。 public static string Number2Chinese( double f )
    {
    const string specialName = "元万亿万";
    const string unitName = "十百千";
    const string numberName = "零壹贰弎肆伍陆戚捌玖";

    f = Math.Round( f, 2 );
    long intPart = (long)f;
    if ( intPart >= 10000000000000000L || intPart < 0 )
    return "" ; string strIntPart="";
    string strFloatPart = "";

    double floatPart = Math.Round( f - (double)intPart, 2 );

    //得到小数部分
    if ( floatPart == 0 )
    {
    strFloatPart = "整";
    }
    else
    { int floatOne = ( int ) ( floatPart * 10 );
    if ( floatOne > 0 )
    {
    strFloatPart = numberName[ floatOne ] + "角";
    }
    int floatTwo = ( int )( floatPart * 100 ) % 10 ;
    if ( floatTwo > 0 )
    {
    strFloatPart += numberName[ floatTwo ] + "分";
    } } //得到整数部分


    int i = 0;
    int bit;
    Stack s = new Stack();
    while( intPart > 0 )
    {
    i++;
    bit = (int)(intPart % 10); if( i % 4 == 1 )
    {
    if ( specialName[ i / 4 ] == '亿' && s.Peek().ToString() == "万" )
    s.Pop(); s.Push( specialName[ i / 4 ] );  if ( bit != 0 )
    s.Push( numberName[ bit ].ToString() );
    }
    else 
    {
    if ( bit == 0 )
    {
    string tmp = s.Peek().ToString(); if ( tmp != "零"&& tmp != "元" && tmp != "万"&& tmp != "亿" )
    {
    s.Push( "零" );
    }
    }
    else
    {
    s.Push( numberName[ bit ].ToString() + unitName[ i % 4 == 0 ? i % 4 + 2 : i % 4 - 2 ] );
    }
    }

    intPart = intPart / 10;
    } while ( s.Count > 0 )
    {
     strIntPart += s.Pop().ToString() ;
    } return strIntPart + strFloatPart;
    }
      

  34.   

    TO  lu_zhi_yong(十一郎):
    你的建议不错啊!我已经照你的意思写出来了!
    请各位高手验证一下:Select * From StudentAchievement  S1
    Where Achievement > = ( Select Top 1 *   From   ( Select Top n Achievement   From StudentAchievement Where CourseID  =S1.CourseID  Order By Achievement desc )   A1 Order By Achievement Asc  ) 
    Order By CourseID asc , Achievement desc上面的n就是前几位!如前3位,n就是3 :)
      

  35.   

    to:  TheAres(班门斧) 
    混csdn这么长时间了 居然有这么一位老大 我怎么一点印象都没有呢
      

  36.   

    TheAres(班门斧)老大,你的小数部分有点问题,帮你改了://得到小数部分
    if ( floatPart == 0 )
    {
    strFloatPart = "整";
    }
    else
    {
    if((intPart%10) == 0) strFloatPart+="零";
    int floatOne = ( int ) ( floatPart * 10 );
    if ( floatOne > 0 )
    {
    strFloatPart += numberName[ floatOne ] + "角";
    }
    else
    {
    strFloatPart = "零";
    }
    int floatTwo = ( int )( floatPart * 100 ) % 10 ;
    if ( floatTwo > 0 )
    {
    strFloatPart += numberName[ floatTwo ] + "分";
    }
    else
    {
    strFloatPart += "整";
    }
    }
      

  37.   

    小数部分现在没有问题了!10.12 -> 壹拾元零壹角贰分
    12.03 -> 壹拾贰元零叁分
    12.30 -> 壹拾贰元叁角整整数部分还是发现了几个bug,正在想办法中.....比如:1000001000.12 -> 壹拾亿壹千元零壹角贰分 应该是:壹拾亿"零"壹千元零壹角贰分
      

  38.   

    不好意思 没写注释 有点乱 但支持无限大 只要你的机器没问题 
    using System;
    using System.Collections;namespace ConsoleApplication2
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
    /// <summary>
    /// 将一个整数转换成一个整数数组
    /// 123456  ==》int[]{6,5,4,3,2,1}
    /// </summary>
    /// <param name="temp"></param>
    /// <returns></returns>
    private static int[] ConvertToArray(int temp)
    {
    ArrayList t= new ArrayList();
    while(temp >= 10)
    {
    t.Add(temp%10);
    temp = temp/10; }
    t.Add(temp);
    int[] b = new int[t.Count] ;
    t.CopyTo(b);
    return b;
    }
    private static int[] IndexIntArrayMulti(int a,int[] c,int position)
    {
    int[] b = (int[])c.Clone();
    ArrayList temp = new ArrayList();
    int length = b.Length;
    while(position>0)
    {
    temp.Add(0);
    position--;
    }
     
    for(int i = 0;i<= length-1;i++)
    {
    int tempMulti = a * b[i];
    b[i]=tempMulti;
    temp.Add(b[i]);

    }
    int[] NewArray = new int[temp.Count]; 
    temp.CopyTo(NewArray);

    int[] gg = NormalizeArray(NewArray);
    return NormalizeArray(NewArray);
    }
    private static int[] ArrayAddArray(int[] ArrayAddTo,int[] ArrayAdd)
    {
    int LenOfArrayAddTo,LenOfArrayAdd,MaxLen;
    LenOfArrayAddTo = ArrayAddTo.Length;
    LenOfArrayAdd = ArrayAdd.Length;
    MaxLen = (LenOfArrayAddTo>LenOfArrayAdd)?LenOfArrayAddTo:LenOfArrayAdd;
    int[] ResultArray = new int[MaxLen];
    for(int i = 0;i<=MaxLen-1;i++)
    {
    int tempArrayAddTo,tempArrayAdd;
    if(i>=LenOfArrayAddTo)
    {
    tempArrayAddTo = 0;
    }
    else
    {
    tempArrayAddTo = ArrayAddTo[i];
    }
    if(i>=LenOfArrayAdd)
    {
    tempArrayAdd = 0;
    }
    else
    {
    tempArrayAdd = ArrayAdd[i];
    }
    ResultArray[i] = tempArrayAddTo + tempArrayAdd ; }
    return NormalizeArray(ResultArray); }
    /// <summary>
    /// 规范化一个整数数组
    /// </summary>
    /// <param name="tempArray"></param>
    /// <returns></returns>
    private static int[] NormalizeArray(int[] tempArray)
    {
    ArrayList tempArrayList = new ArrayList();
    int length = tempArray.Length;
    for(int i = 0;i<= length-2;i++)
    {
    int t = tempArray[i];
    tempArray[i] =  t%10;
    tempArray[i+1] = tempArray[i+1] + t/10;
    tempArrayList.Add(tempArray[i]);

    }
    tempArrayList.Add(tempArray[length -1 ]);
    if((int)tempArrayList[length -1]>=10)
    {
    int t = (int)tempArrayList[length-1];
    tempArrayList[length-1] = t%10;
    tempArrayList.Add(t/10);
    }
    int[] NewArray = new int[tempArrayList.Count];
    tempArrayList.CopyTo(NewArray);
    return NewArray;
     
    }
    private static int GetLevel(int temp)
    {
    int level = 0;
    while(temp>=10)
    {
    temp = temp / 10;
    level++;
    }
    level++;
    return level;
    }
    private static int[] ArrayMultiArray(int[] ArrayMultiTo,int[] ArrayMulti)
    {
    int MultiCount = ArrayMulti.Length;
    int[] ResultArray = new int[ArrayMultiTo.Length];
    for(int curPosition = 0;curPosition <= MultiCount-1; curPosition++)
    {
    int[] tempIndexIntArrayMulti = IndexIntArrayMulti(ArrayMulti[curPosition],ArrayMultiTo,curPosition);
    ResultArray = ArrayAddArray(ResultArray,tempIndexIntArrayMulti);

    } return ResultArray; }
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
    int Max = 100;
      int[] Result=new int[1] ;
    Result[0]=1;


    for(int i=1;i<=Max;i++)
    {
    Result = ArrayMultiArray((int[])(Result.Clone()),(int[])ConvertToArray(i).Clone());
    }
    for(int i=Result.Length-1;i>=0;i--)
    {
    Console.Write(Result[i]);
    }
     
     
    Console.ReadLine();
    }
    }
    }
      

  39.   

    up
    up
    up
    up
    up
    up
    up
    向牛人致敬!!!!!!!!!!!!11
      

  40.   

    四、编程实现求出若干个整数之和为500的连续整数(如98,99,100,101,102),所有组合。
    这道题目不难,但有不少做法,下面写我的做法思路 连续数字得和, 可以看成是(首个数字-1)*连续数字个数+从1开始到连续数字个数的求和
    例如 如3,4,5 =>2*3+(1+2+3)=12
         如4,5,6,7=>3*4+(1+2+3+4)=22
     那么设开始数为X,连续数字个数为N,则(X-1)*N+(从1开始N的求和)=500
    X=[500-(从1开始N的求和)]/N+1
    可以写个小循环来求和N,来判断,这样就降低运算量拉,下面是我用VB写的.请指教Dim i As Integer, t As Integer, c As Integer
    For i = 1 To 30
     
        t = t + i
        If (500 - t) Mod i = 0 And i > c Then
            List1.AddItem (500 - t) / i + 1 & " " & i
            c = i
            i = 0:   t = 0
        End IfNext
      

  41.   

    第三题还可以这样写
    select * from studentachievement a
    where achievement in 
    (select top 2 b.achievement 
    from studentachievement b
    where a.courseid = b.courseid
    order by b.achievement desc)
    order by a.courseid,a.achievement desc
      

  42.   

    4.
    #include <stdio.h>int main()
    {
    int m;
    int i,j;
    for (i=1;i<50;i++)   /*如果单独500这个数不算的话可以把i=1改为i=4*/
    {
    if(i % 2 != 0)   /*如果数字个数是奇数个*/
    m = 500/i - (i-1)/2;   /*得到最小数*/
    else    /*如果数字个数是偶数个*/
    m = 500/i - (i-2)/2;   /*得到个数是偶数个时的最小数*/
    if(m*i+i*(i-1)/2==500)   /*组合里的数据和等于500*/
    {
    for(j=0;j<i;j++)  /*输出数据*/
    {
    printf("%d",m+j);
    printf(" ");
    }
    printf("\n");
    }
    }
    return 0;
    }
      

  43.   

    fancyf(凡瑞) 负数不可能达到要求的