| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1160 人关注过本帖
标题:POJ1001测试值位数相同,数值有偏差
只看楼主 加入收藏
i多子妹师南
Rank: 1
来 自:江苏
等 级:新手上路
帖 子:12
专家分:4
注 册:2016-11-13
结帖率:85.71%
收藏
已结贴  问题点数:12 回复次数:5 
POJ1001测试值位数相同,数值有偏差
Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

可以直接运行
下面是输入和输出
Sample Input

95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
Sample Output

548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
Hint

#include<stdio.h>
#include<string.h>

   
char *multiply1(char *numberN,char *numberM);
void mi();
int main()
{
/*    char numberN[1500], numberM[1500];//为什么这里不能定义为char *num呢?
    scanf("%s%s", numberN, numberM);
    char *j;
    j=multiply1(numberN,numberM);
    puts(j);
*/
while(1)
 mi();
 
}
void mi()
{
    char di[1500];
    int mici;
    printf("输入底数,0.0-99.999;输入幂,1-25\n ");
    scanf("%s",di);
    scanf("%d",&mici);
    int i;
    char *qu[mici];//定义一个char 数组,用于存储不同幂次下的值
    qu[0]=di;

    for(i=0;i<mici-1;i++)
    {
        
   
    qu[i+1]=multiply1(qu[i],di);
    }
    puts(qu[mici-1]);
}
char *multiply1(char *numberN,char *numberM)//高精度乘法
{
    int n1,n2;//n1,n2是小数点位置。
    int i, j;
    char w[1500];
    int k=0;
    int n = strlen(numberN), m = strlen(numberM);//求字符串长度

   
   int a[n]={0}, b[m]={0};//这样就先把数组置为全0
 
    for (i = 0, j = n - 1; j>=0; j--) {
        if(numberN[j]!='.')//要找出小数点的位置
        {
           a[i] = numberN[j] - '0';
           i++;
        }
        else
        n1=i;
    }

   for (i = 0, j = m - 1;j>=0;j--) {
        if(numberM[j]!='.')
        {
           b[i] = numberM[j] - '0';
           i++;
         }
         else
         n2=i;
    }
    int c[3000];
    for (i = 0; i < 3000; i++) {
        c[i] = 0;
    }
  
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            c[i + j] += a[i] * b[j];
        }
    }   
    for (i = 0; i < n + m-1; i++) {//这里的总位数是否是n+m-1
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
     

        for (j = 2999; j > 0; j--) {
        if (c[j] != 0)
        break;
    }

if(n1+n2>j)
{
    w[0]='0';
    w[1]='.';
    k=2;
    for(i=1;i<=n1+n2-j-1;i++)
  {
     w[k]='0';
     k++;
  }
  for(i=j;i>=0;i--)
  {
      w[k]=48+c[i];
      k++;
  }
}
else
{

   i=j;

  while(i>=0)
  {
    if(i!=n1+n2-1)
    {
        w[k]=48+c[i];
        i--;
        k++;
    }
    else
    {
      w[k]='.';
      k++;
      w[k]=c[i]+48;
      i--;
    }
 }
}
return w;
}
搜索更多相关主题的帖子: the For int char i++ 
2017-12-28 12:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
贴完了题目自己要看一下
我来帮这个提问者说一下吧

输入实数R( 0.0 < R < 99.999 )和整数n( 0 < n <= 25 ),计算R的n次方的精确值。

样例输入
5.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

样例输出
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
2017-12-28 16:32
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
搜索到原题了
http://
2017-12-28 16:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
必须看原题链接呀,因为题主不肯将必要的信息贴出来,比如
The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.
没有以上必要信息的话,就不知道R的最多有效数是几位,也就做不下去了。

2017-12-28 16:46
i多子妹师南
Rank: 1
来 自:江苏
等 级:新手上路
帖 子:12
专家分:4
注 册:2016-11-13
收藏
得分:0 
回复 4楼 rjsp
我这程序可以运行,只是数据结果和题目给出的结果有偏差,位数相同。
那个乘法函数是先转化为整数的高精度程度,然后找出小数点的位数,然后插入小数点,最后返回的仍然是两个含小数的两个数相乘得到的结果,用字符数组返回。
由于幂次会大于2次,就反复调用这个乘法函数
2017-12-28 19:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
回复 5楼 i多子妹师南
这题乘法计算时间复杂度为o(n^2)

要计算N次不知道会不会超时~

或者高级点的有种叫FFT的算法,再加个快速幂……感觉这题可以很深很深~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-12-28 19:56
快速回复:POJ1001测试值位数相同,数值有偏差
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026962 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved