主题:请教一道复试题
yecha1333
[专家分:0] 发布于 2009-04-06 19:19:00
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个回复)
沙发
HeroSong [专家分:940] 发布于 2009-04-07 20:05:00
这个题太简单了。其意是计算n个R相乘的精确结果。就是设一个循环,让R自乘n次。关键是设置结果的类型,如long double,或者精度更高的类型。
板凳
yecha1333 [专家分:0] 发布于 2009-04-07 21:42:00
需要数组模拟手乘,没那么简单吧
3 楼
JackieRasy [专家分:3050] 发布于 2009-04-07 22:18:00
按照你那样做,肯定溢出。
这里明显是要用到大数乘法的~~
对于高精度的问题,我们仍然采用经典的想法,即将数值一位一位地存储到大数组中。那么在计算的过程中,我们就一位一位的计算,先不考虑其值是否大于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 楼
JackieRasy [专家分:3050] 发布于 2009-04-07 22:44:00
PS. 请问一下楼主这是什么复试题?
5 楼
yecha1333 [专家分:0] 发布于 2009-04-09 15:09:00
谢谢,西电保研的同学复试时的机试题
6 楼
JackieRasy [专家分:3050] 发布于 2009-04-09 16:52:00
[quote]谢谢,西电保研的同学复试时的机试题[/quote]
西电保研考这种题?
这群西电的老师们,真的没有创造力了...
7 楼
Chipset [专家分:16190] 发布于 2009-04-09 18:07:00
考研时常常听别人念叨:保研的过着猪一样的生活,找工作的过着狗一样的生活,考研的过着猪狗不如的生活...
研究生,唉,其实很多就是烟酒生,抽烟喝酒什么坏毛病一大堆,其实狗屁学问也没有。
我读研的时候,班上有8个是保研的,他们成绩都很好,还有一大批科班出生高分考上拿公费的...,二者之和大约是15名,他们对于我们这些旁门左道上来的一向不屑一顾...,呵呵,其实他们除了会考试会背几个定义真还想不出他们还有什么学问。不过也难怪,一大批应试教育的受害者个个还自以为是沾沾自喜呢...
直到大公司来招人,微软,IBM,...,经过一系列较量,算法,程序设计,英语...他们暮然回首才发现,唉,原来进大公司的这些人,太多都是旁门左道...。于是他们慨叹...唉,大公司招人的都有些“弱智”,找了一群下等水平的人去...
希望你不像他们这些“优等生”那么水货。
8 楼
moke9 [专家分:30] 发布于 2010-09-02 07:46:00
你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846
我来回复