• 一个很有趣的程序员等级考试题求循环小数


    求两个数相除的商,并计算出小数点后的循环部分。例如1/3 商为0.333333333... ,则表示为0.(3)

    简单实现以下:

    aspx页:

    代码
    1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default5.aspx.cs" Inherits="Default5"%>
    2
    3  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4
    5  <html xmlns="http://www.w3.org/1999/xhtml">
    6  <head runat="server">
    7 <title></title>
    8  </head>
    9  <body>
    10 <form id="form1" runat="server">
    11 <div>
    12 <p>
    13 除数:<asp:TextBox ID="txtDivisor" runat="server" onkeyup="if(event.keyCode!=37&amp;&amp;event.keyCode!=39)value=value.replace(/\D/g,'');"></asp:TextBox>
    14 </p>
    15 <p>
    16 被除数:<asp:TextBox ID="txtDividend" runat="server" onkeyup="if(event.keyCode!=37&amp;&amp;event.keyCode!=39)value=value.replace(/\D/g,'');"></asp:TextBox>
    17 </p>
    18 <p>
    19 小数个数:<asp:TextBox ID="txtCount" runat="server" onkeyup="if(event.keyCode!=37&amp;&amp;event.keyCode!=39)value=value.replace(/\D/g,'');"></asp:TextBox>
    20 </p>
    21 <asp:Button ID="btnResults" runat="server" Text="结果"
    22 onclick="btnResults_Click"/>
    23 <p>
    24 <asp:Label ID="lbResults" runat="server" Text=""></asp:Label>
    25 </p>
    26 </div>
    27 </form>
    28  </body>
    29  </html>

    aspx.cs页:

    代码
    1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Web;
    5 using System.Web.UI;
    6 using System.Web.UI.WebControls;
    7
    8 publicpartialclass Default5 : System.Web.UI.Page
    9 {
    10 protectedvoid Page_Load(object sender, EventArgs e)
    11 {
    12 if (IsPostBack)
    13 {
    14 txtDivisor.Text = txtDivisor.Text;
    15 txtDividend.Text = txtDividend.Text;
    16 txtCount.Text = txtCount.Text;
    17 }
    18 }
    19 protectedvoid btnResults_Click(object sender, EventArgs e)
    20 {
    21 if (txtDivisor.Text.Trim().Length <1)
    22 {
    23 return;
    24 }
    25 if (txtDividend.Text.Trim().Length <1)
    26 {
    27 return;
    28 }
    29 if (txtCount.Text.Trim().Length <1)
    30 {
    31 return;
    32 }
    33
    34 int _divisor = Convert.ToInt32(txtDivisor.Text);
    35 int _dividend = Convert.ToInt32(txtDividend.Text);
    36 int _count = Convert.ToInt32(txtCount.Text);
    37 if (_dividend ==0)
    38 {
    39 return;
    40 }
    41 lbResults.Text = DivResult(_divisor, _dividend, _count);
    42
    43 }
    44 //运算主体
    45 protectedstring DivResult(int divisor, int dividend, int count)
    46 {
    47 string _divresult ="";
    48 int tempdivisor =0;
    49 for (int i =0; i <= count; i++)
    50 {
    51 if (i ==0)
    52 {
    53 _divresult = (divisor / dividend).ToString() +".";
    54 tempdivisor = divisor % dividend;
    55 }
    56 else
    57 {
    58 int _tempdivisor = MaxMin(tempdivisor, dividend);
    59 if (_tempdivisor !=0)
    60 {
    61 _divresult = _divresult + ReturnZero(_tempdivisor, tempdivisor) + (_tempdivisor / dividend).ToString();
    62 tempdivisor = _tempdivisor % dividend;
    63 }
    64 else
    65 {
    66 _divresult = _divresult +'0';
    67 }
    68 }
    69 }
    70 string[] temp = _divresult.Split('.');
    71 string temp1;
    72 temp1= temp[1] = temp[1].Length < count ? temp[1] : temp[1].Substring(0, count);
    73 string _repeatstr = CheckRepeat(temp[1]);
    74 if (_repeatstr.Length >0)
    75 {
    76 temp[1] = temp[1].Remove(temp[1].IndexOf(_repeatstr)) +"("+ _repeatstr +")";
    77 }
    78
    79 return temp[0] +"."+ temp[1] +"<br/>"+ temp[0] +"."+ temp1;
    80 }
    81 //判断返回的零
    82 privatestring ReturnZero(int _tempdivisor, int tempdivisor)
    83 {
    84 int n = (int)Math.Log10(_tempdivisor / tempdivisor);
    85 string ret ="";
    86 for (int i =1; i < n; i++)
    87 {
    88 ret +='0';
    89 }
    90 return ret;
    91 }
    92 //判断除数与被除数的大小
    93 privateint MaxMin(int divisor, int dividend)
    94 {
    95 if (divisor > dividend && divisor !=0)
    96 {
    97 return divisor;
    98 }
    99 elseif (divisor ==0)
    100 {
    101 return divisor;
    102 }
    103 else
    104 {
    105 return MaxMin(divisor *10, dividend);
    106 }
    107 }
    108 //判断小数点后的循环部分
    109 privatestring CheckRepeat(string oldstr)
    110 {
    111 int[] olditems =newint[oldstr.Length];
    112 for (int i =0; i < oldstr.Length; i++)
    113 {
    114 olditems[i] = Convert.ToInt32(oldstr.Substring(i, 1));
    115 }
    116
    117 int n =1; //每次比较的次数
    118 int equalcount =0;//每次比较相等的次数
    119 for (int i = olditems.Length -1; i > olditems.Length /2; i--)
    120 {
    121 equalcount =0;
    122 for (int j =0; j < n; j++)
    123 {
    124 if (olditems[olditems.Length -1- j] != olditems[olditems.Length -1- j - n])
    125 {
    126 break;
    127 }
    128 equalcount++;
    129 }
    130 if (n == equalcount)
    131 {
    132 break;
    133 }
    134 n++;
    135 }
    136 string ret ="";
    137 for (int i = equalcount -1; i >=0; i--)
    138 {
    139 ret += olditems[olditems.Length -1- i].ToString();
    140 }
    141 return ret;
    142 }
    143 }
    144

    我只是简单的实现了一下!没有专门测试!如果有bug,请园友发消息告诉我啊!! 呵呵..

  • 相关阅读:
    SQL分类
    广度/深度优先生成树
    图的基本概念
    哈夫曼树构造/哈夫曼编码
    二叉排序树/平衡二叉树
    树、森林与二叉树的转换
    树/二叉树的基本性质
    /*传说中的土办法找中序前驱*/
    KiCAD原理图更换库
    博客园添加版权信息
  • 原文地址:https://www.cnblogs.com/zydf/p/1689582.html
Copyright © 2020-2023  润新知