标题:float型出错了,怎么改呀?
只看楼主
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
结帖率:88.89%
已结贴  问题点数:20 回复次数:10 
float型出错了,怎么改呀?
我有这样一个程序,如下:
程序的用意在于,输入一个浮点数,比如0.07(0.01-----0.07),然后我要找出其中等于0.07(可任意换)的序列
序列为:
0.07=0.01+0.06
0.07=0.01+0.02+0.04
0.07=0.02+0.05
0.07=0.03+0.04

程序,有错,不知道在哪里,请高手解答下。
程序代码:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"

int main()
{
    double n,flag;
    int m,j,k,t,r,i;
    double *p;
    double sum=0.00;
    printf("请输入数字的个数:");   //比如说,你输入一个50,其构成的序列是(1----50)的递增序列,有50个数。
    scanf("%d",&m);                    //输入这个数字
   
    p=(double *)malloc(m*sizeof(double));  //动态分配一个空间.(如果用数组,则无法保证你可以任意输入数字的个数,因为是静态的了)
    for (i=0,flag=0.01;i<m;i++)                //
    {
        p[i]=flag;
        flag=flag+0.01;                //赋值语句
    }
    for (i=0;i<m;i++)                //格式控制输出,每一行输出10个数。
    {
        if (i%9==0)
            printf("\n");
        printf("%-5.2lf",p[i]);
    }
    printf("\n");
   
    printf("请输入这个序列的和:");    //输入你要的那个序列的和的值
    scanf("%lf",&n);                    //输入这个值
   
    for (i=0;i<m/4;i++)            //说明:为什么是(i<m/4)?我推算,其比较次数不会超过m/4,如果写成i<m也行。(其实比较次数并没有m次,有多余操作)
    {
        if (p[i]>n)                    //判断第一个数是否大于了n值
            exit(-1);
        for (j=1;j<m;j++)            //j代表的是所选定的待比较的数字的个数
        {
            for (t=i;t<j+i;t++)        //我们把前j+i个数字的和存到sum里面,备用。
                sum+=p[t];
            if (sum<n)                //如果sum已经大于n值了,退出当前循环。选定下一个关键码p[1],当前关键码是p[0]
            {   
               
                for (k=j+i;k<m;k++)  //因为前j+i(并不包括p[j+i])的和已经知道,只需要比较(j+i)到m之间是否有值与sum的和恒等于n即可
                {
                   
                    if((sum+p[k])!=n)  //如果当前待比较的值与sum的和不等于n,则需比较下一个
                        continue;
                    printf("%-5.2lf=",n);
                    for (r=i;r<j+i;r++)   //输出选出的值并把先前选定的序列一起输出即为我们要的序列
                        printf("%-5.2lf+",p[r]);
                    printf("%-5.2lf",p[k]);
                    printf("\n");
                }   
            }
            sum=0.00;                                   //再次清零       
        }
        printf("\n");
    }
    getch();
    return 0;
}
/*
说明:
比如,我现在有一个1----7的序列,分别为1 2 3 4 5 6 7 ,现在,我要让程序找出其中为7的组合
7=1+6
7=1+2+4
7=2+5
7=3+4

  此时,我用个指针i和一个标志j。当前i指向2,j是3(表示从2开始的连续3个数是已经选定的)我们只需要从数字5这个位置往后开始判断,找到一个数,能与其和恒等于7即可
*/

搜索更多相关主题的帖子: float 
2010-07-21 16:40
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
得分:0 
补充:如果是int型,结果却没有问题,换成double型或者float型就出错了 。这是为什么呀?

~~~~~~我的明天我知道~~~。
2010-07-21 16:44
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
得分:0 
斑竹请进呀,在线等各位的解答啊。

~~~~~~我的明天我知道~~~。
2010-07-21 17:23
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:4 
第一感觉是 浮点数比较不对,你的结果是不是多输出了一些答案?
要不,你放大100倍成整数,

[ 本帖最后由 BlueGuy 于 2010-7-21 17:57 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-21 17:50
error007
Rank: 2
等 级:论坛游民
帖 子:32
专家分:23
注 册:2010-7-12
得分:4 
我的理解,你定义成浮点数后,0.07,它是从0.000000~0.07之间的任意数,组合多着了.

天才就是重复次数最多的人。
2010-07-21 19:31
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:4 
LZ你可以试试四楼的方法,是不是输出问题,比如说类型出错

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-22 10:59
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
得分:0 
四楼的想法,固然是对的。可是,我 好像 貌似 的确 还是不会。
还请版主在我源码的基础上改改,算法没什么问题,感觉就是数据类型上出错了。
在线等。。。谢谢

~~~~~~我的明天我知道~~~。
2010-07-22 16:38
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include <math.h>
int main()
{
    double n,flag;
    int m,j,k,t,r,i;
    double *p;
    double sum=0.00;
    printf("请输入数字的个数:");   //比如说,你输入一个50,其构成的序列是(1----50)的递增序列,有50个数。
    scanf("%d",&m);                    //输入这个数字
   
    p=(double *)malloc(m*sizeof(double));  //动态分配一个空间.(如果用数组,则无法保证你可以任意输入数字的个数,因为是静态的了)
    for (i=0,flag=0.01;i<m;i++)                //
    {
        p[i]=flag;
        flag=flag+0.01;                //赋值语句
    }
    for (i=0;i<m;i++)                //格式控制输出,每一行输出10个数。
    {
        if (i%9==0)
            printf("\n");
        printf("%-5.2lf",p[i]);
    }
    printf("\n");
   
    printf("请输入这个序列的和:");    //输入你要的那个序列的和的值
    scanf("%lf",&n);                    //输入这个值
   
    for (i=0;i<m;i++)            //说明:为什么是(i<m/4)?我推算,其比较次数不会超过m/4,如果写成i<m也行。(其实比较次数并没有m次,有多余操作)
    {
        if (p[i]>n)                    //判断第一个数是否大于了n值
            exit(-1);
        for (j=1;j<m;j++)            //j代表的是所选定的待比较的数字的个数
        {
            for (t=i;t<j+i;t++)        //我们把前j+i个数字的和存到sum里面,备用。
                sum+=p[t];
            if (sum<n)                //如果sum已经大于n值了,退出当前循环。选定下一个关键码p[1],当前关键码是p[0]
            {   
               
                for (k=j+i;k<m;k++)  //因为前j+i(并不包括p[j+i])的和已经知道,只需要比较(j+i)到m之间是否有值与sum的和恒等于n即可
                {
                  
                    if(fabs((sum+p[k]) - n) > 0.000001)  //如果当前待比较的值与sum的和不等于n,则需比较下一个
                        continue;
                    printf("%-5.2lf=",n);
                    for (r=i;r<j+i;r++)   //输出选出的值并把先前选定的序列一起输出即为我们要的序列
                        printf("%-5.2lf+",p[r]);
                    printf("%-5.2lf",p[k]);
                    printf("\n");
                }   
            }
            sum=0.00;                                   //再次清零      
        }
        printf("\n");
    }
    getch();
    return 0;
}

我就是真命天子,顺我者生,逆我者死!
2010-07-25 19:59
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
if(fabs((sum+p[k]) - n) > 0.000001)  //如果当前待比较的值与sum的和不等于n,则需比较下一个
                        continue;

我就是真命天子,顺我者生,逆我者死!
2010-07-25 20:00
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
for (i=0;i<m/4;i++)
我不知道你的推断是否正确,就改动了,
 

浮点数一般是不会相等的,
所以类似这样的语句会导致死循环。
for (i = 0.01; i != 0.07; i+= 0.01)

            

[ 本帖最后由 BlueGuy 于 2010-7-25 20:08 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-25 20:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-313634-1-1.html




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

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