回 帖 发 新 帖 刷新版面

主题:请教一道复试题

Problem E. 请写一个程序,计算Rn精确结果(0.0<R<99.999,n是整数且0<n<=25)。
输入说明:有多组数据,每组数据占一行,用一对数据表示,第一个数据是R(含小数点共6位),第二个数据是n,两个数之间有一个空格。
输出说明:对每个输入输出其结果(占一行)
输入样本:
95.123   12
0.4321   20
6.7592   9
98.999   10
1.0100   12
输出样本:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201

实在是想不出,请高手指点一下,谢谢

回复列表 (共8个回复)

沙发

这个题太简单了。其意是计算n个R相乘的精确结果。就是设一个循环,让R自乘n次。关键是设置结果的类型,如long double,或者精度更高的类型。

板凳

需要数组模拟手乘,没那么简单吧

3 楼

按照你那样做,肯定溢出。

这里明显是要用到大数乘法的~~

  对于高精度的问题,我们仍然采用经典的想法,即将数值一位一位地存储到大数组中。那么在计算的过程中,我们就一位一位的计算,先不考虑其值是否大于10;最好再处理前后的0问题与每位的进位问题.

#include<cstdio>
#include<stdlib>
#include<string>
 
//利用数组计算
void jisuan(char a[], int n)
{
       int result[1001] = {0};      //结果的记录
       int i = 0;
       int j = 0;                   //用于记录整数的位置
       int flag = 0;                //标志号
       int Len, dLen;               //分别用于记录去掉小数点后,总长度与小数点的长度
       int inta, temp1;             //用于存储数值与辅助值
       int temp2;                   //辅助值2
       int lastlen;                 //确认最后小数的数组长度
       int p, q;
 
       //找到小数点的位置
       while (a[i])
       {
              if (a[i] != '.' && !flag)
              {
                     j++;
              }
           //找到小数点,并且将小数点这一位开始,数值向前移动一位
              else
              {
                     if (!flag)
                     {
                            i++;
                            flag = 1;
                            continue;
                     }
                     else
                     {
                            a[i - 1] = a[i];
                     }
              }
              i++;
       }
 
       Len = strlen(a);                  //记录去掉.的字符串多少
       dLen = Len - j - 1;               //记录小数位的大小
       if (dLen < 0)
       {
              dLen = 0;
       }
       if (i != 1)
       {
              a[i - 1] = a[i];
       }
      
       inta  = atoi(a);           //将字符串中的数字转化位整形数值
       temp1 =inta;
       i = 0;
 
       //基本思路就是转换成整数数组运算,然后再来点小数点
       while (temp1 > 0)             //将整形数值以数值的形式转化给数组
       {
              result[1000 - i] = temp1 % 10;
              temp1 = temp1 / 10;
              i++;
       }                    
 
       //开始计算,关键代码在于此:
       //分数与分数之间的相乘,用一个固定值分别与数组中的每一个数值相乘
       temp2 = n;  
       while (temp2 != 1)
       {
              for (i = 1000; i > 0; i--)
              {
                     result[i] = result[i] * inta;
              }  
              for(i = 1000; i > 0; i--)
              {
                     if (result[i] / 10 != 0)
                     {
                            result[i - 1] = result[i - 1] + result[i] / 10;
                            result[i] = result[i] % 10;
                     }
              }
              temp2--;
       }
 
       //打印
       lastlen = dLen * n;                   //确认最后小数的数组长度
 
       //解决前后0的情况,并将前后不为0的情况记录p、q
       for (p = 1; p <= 1000 && result[p] == 0; p++)
       {
              ;
       }
       if (p > 1000)
       {
              printf("0");
              return;
       }
       for (q = 1000; q >= 1 && result[q] == 0; q--)
       {
              ;
       }
 
       if (1000 - p + 1 <= lastlen)      //考虑到0.几的情况问题
       {
              printf(".");
              for (i = 1000 - lastlen + 1; i <= q; i++)
              {
                     printf("%d", result[i]);
              }
              printf("\n");
       }
       else
       {
              if (1000 - q >= lastlen)         //考虑没有小数的情况
              {
                     for (i = p; i <= 1000 - lastlen; i++)
                     {
                            printf("%d", result[i]);
                     }
                     printf("\n");
              }
              else         //正常的情况
              {
                     for (i = p; i <= 1000 - lastlen; i++)
                     {
                            printf("%d", result[i]);
                     }
                     printf(".");     
                     for (i = 1000 - lastlen + 1; i <= q; i++)
                     {
                            printf("%d", result[i]);
                     }
                     printf("\n");
              }
       }
}
 
int main()
{
       char s[7];
       int n;
      
       while (scanf("%s%d", s, &n) != EOF)
    {
      jisuan(s, n);
    }
 
       return 0;
}

4 楼

PS. 请问一下楼主这是什么复试题?

5 楼

谢谢,西电保研的同学复试时的机试题

6 楼

[quote]谢谢,西电保研的同学复试时的机试题[/quote]

西电保研考这种题?

这群西电的老师们,真的没有创造力了...

7 楼

考研时常常听别人念叨:保研的过着猪一样的生活,找工作的过着狗一样的生活,考研的过着猪狗不如的生活...

研究生,唉,其实很多就是烟酒生,抽烟喝酒什么坏毛病一大堆,其实狗屁学问也没有。

我读研的时候,班上有8个是保研的,他们成绩都很好,还有一大批科班出生高分考上拿公费的...,二者之和大约是15名,他们对于我们这些旁门左道上来的一向不屑一顾...,呵呵,其实他们除了会考试会背几个定义真还想不出他们还有什么学问。不过也难怪,一大批应试教育的受害者个个还自以为是沾沾自喜呢...

直到大公司来招人,微软,IBM,...,经过一系列较量,算法,程序设计,英语...他们暮然回首才发现,唉,原来进大公司的这些人,太多都是旁门左道...。于是他们慨叹...唉,大公司招人的都有些“弱智”,找了一群下等水平的人去...

希望你不像他们这些“优等生”那么水货。

8 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册