| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1648 人关注过本帖
标题:一个用数学思想写程序的小探索记录
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 10 楼 TonyDeng
这还得接着写代码实现吗? 数据准备好  代码按语言规范来 就可以照搬实现了
有点不想写代码了 越来越喜欢数学和哲学了 伪代码挺好

[ 本帖最后由 zhu224039 于 2014-6-27 16:15 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-27 15:53
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:3 
以下是引用zhu224039在2014-6-27 15:53:01的发言:

这还得接着写代码实现吗? 数据准备好  代码按语言规范来 就可以照搬实现了
有点不想写代码了 越来越喜欢数学和哲学了

可以呀,自己不想写就不用写了。

总有那身价贱的人给作业贴回复完整的代码
2014-06-27 15:56
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:3 
回复 11 楼 zhu224039
数学和哲学不过是从不同的角度去描述宇宙时空,包括我们未知的东西. 而其它的所有知识都是从两者的基础之上衍生出来的,然后反过来为这两者服务.

两者其实是相通的,等价的. 两者的一个共同点就是高度抽象.

人类遇到的所有问题最后都可以转化为数学问题.

代码测试环境:  WinXP+C-Free5.0.
2014-06-27 20:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
空中楼阁。一幅从来没实现过的建筑图,连可行性和效果如何都不知道,真正施工起来需要解决的现实问题比空想多得多。不明白你这么几年的选择总是那么古怪的,算了,由得你。

授人以渔,不授人以鱼。
2014-06-27 21:34
Dezen
Rank: 1
等 级:新手上路
帖 子:2
专家分:3
注 册:2014-6-27
收藏
得分:3 
回复 楼主 zhu224039
首先数据从后向前进行猜测
因为要结束一场比赛,赢的一方是最后得分的一方
令countA 代表胜方
  countB 代表负方


win规则
countA在21分的时候拿下比赛 即:
countA==21 and  countA-countB>=2

countA在大于21分的情况下拿下比赛,则必须有countA-countB=2 即
countA>21 and  countA-countB=2

综合起来就是:
(countA==21 and  countB<=19) or (countA>21 and  countA-countB=2)


unknow规则
到达获胜条件 countA>=21 的时候

countA=21时
对上面win情况对countA-countB 进行取反 可知道 countA-countB<2  
在-1=<countA-countB<=1的时候 两者未能分出胜负将它排除后可以得到 即:
countA=21时  countA-countB<-1时  unknow

countA>21时
对上面win情况进行取反  可知道 countA-countB!=2
对上述条件进行分析
-1<=countA-countB=<1的时候 两者未能分出胜负 可以继续比赛 从countA-countB!=2中 去掉这个条件可以得到
countA-countB<-1 和  countA-countB>2 即:
countA>21时 (countA-countB<-1) or (countA-countB>2) 时  unknow
综合起来就是:
(countA=21 and countA-countB<-1)  or (countA>21 and ((countA-countB<-1) or (countA-countB>2)))

上述win 和 unknow 条件分析总结得出
if (countA==21 and  countB<=19) or (countA>21 and  countA-countB=2)
      win;
if (countA=21 and countA-countB<-1)  or (countA>21 and ((countA-countB<-1) or (countA-countB>2)))
      unknow

上述对于程序的接受和不接受的结果条件判定结束

我要成为嘿嘿的黑客,替天行道
2014-06-27 22:38
幻世梵天
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2014-2-7
收藏
得分:3 
感觉分析很全面
2014-06-27 23:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
写代码的前提条件是对待解决问题的充分分析,否则那不是瞎写么。至于要不要强调一定是数学分析这倒不必。虽然再我看来所有的分析都是数学的,不过这容易招至一部分对数学反感的人的抵触呵呵。

赞同朱三的感悟,但需要指明一点,你的分析是不全面的,因为不全面所以也是错误的。基于错误的分析,你的伪代码也不可能得到正确的结果。

其实朱三现在面临的最大的障碍还不在理论分析能力上(关于分析,学无止境),而在于从理论到实践的转化能力上。我猜你现在写不出这个问题的实际代码(不然也不会被Tony钻空子训斥了)。

呵呵,当然,必须强调我是猜的,也许你确实是懒得写。

重剑无锋,大巧不工
2014-06-28 21:43
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 17 楼 beyondyf
好久不见

总有那身价贱的人给作业贴回复完整的代码
2014-06-28 21:58
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
回复 17 楼 beyondyf
程序代码:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int  str_to_num(char *str,int n);
void strs_to_nums(char *str,int *data,int n);
void nums_to_strs(int *num,char *string);
void function(int countA,int countB,int flag,int n,int i);



int arrary[5][4];
int *data;
int arrary1[5][2];
int _tmain(int argc, _TCHAR* argv[])
{
    FILE *fpin,*fpout;
    char str[10], *datastring;
    int num1=0,num2,flag,counta,countb,i;

    fpin=fopen("c:\\ponit.in","r");
    if(fpin==NULL){
        printf("打开数据文件失败!");
        exit(0);
    }
    fpout=fopen("c:\\ponit.out","w+");
    if(fpout==NULL){
                fclose(fpin);
        printf("打开记录结果文件失败!");
        exit(0);
    }
    
        fgets(str,5,fpin);
        num1=str_to_num(str,5);
        //printf("%d\n",num1);
    while(num1-->0){
        memset(arrary,0,80);
        memset(arrary1,0,40);
        fgets(str,10,fpin);
        num2=str_to_num(str,10);
        datastring=(char*)malloc(sizeof(char)*2*num2+2);
        data=(int*)malloc(sizeof(int)*num2);
        fgets(datastring,2*num2+2,fpin);
        strs_to_nums(datastring,data,num2);
        free(datastring);
        flag=0;counta=0;countb=0;i=0;
        function(counta,countb,flag,num2-1,i);
        if(!((arrary[2][3]==1&&arrary[4][3]==0)||(arrary[2][3]==0&&arrary[4][3]==1)))    //猜解成功的条件是 要么在第三场取得胜利,要么就是在第五场取得
               fputs("unknow\n",fpout);                                                  //其余的都是错误的猜解 
               //printf("unkonw");
        else{
            datastring=(char*)malloc(sizeof(char)*20);
            for(i=0;arrary1[i][0]!=0&&i<5;i++){
                //printf("%d %d\n",arrary1[i][0],arrary1[i][1]);
                 nums_to_strs(arrary1[i],datastring);
                 fputs(datastring,fpout);
            }
            free(datastring);
        
        }

        free(data);
        
    }
    //getchar();
    fclose(fpin);
    fclose(fpout);
    return 0;
}


int  str_to_num(char *str,int n)
{
    int i=0,num=0;
    for(;i<n;i++){
        if(str[i]=='\n'||str[i]=='\0')
            break;
        num=num*10+str[i]-'0';
        //printf("%x\n",str[i]);
    }
    return num;
}

void strs_to_nums(char *str,int *data,int n)
{
    int i=0;
    for(;i<n;i++){

        if(str[2*i]=='X')
            data[i]=10;
        else
            data[i]=str[2*i]-'0';
        //printf("%c ",str[2*i]);
    }
    
    
}

void nums_to_strs(int *num,char *string)
{
    int i,j=0,k=0; char p[8];
    while(k<2){
        
        itoa(num[k],p,10);
        for(i=0;i<8;i++){
            if(p[i]=='\0')
                break;
            string[j]=p[i];
            j++;
        }
        if(k==0){
            string[j]=':';
            j++;
        }
        k++;
    }
    
    string[j]='\n';
    string[j+1]='\0';

    
}

void function(int countA,int countB,int flag,int n,int i)                                 //核心部件
{
    int j,count=0;
    
    for(j=n;j>=0;j--){
         if(arrary[2][3]>1)
             return;                        
         if(arrary[4][3]>1)
             return;
         if(arrary[2][3]==1&&arrary[4][3]==1)
             return;                                       //有多个解的时候 提前退出猜解

         if(flag==0) {                                    //你计分一次 我计分一次 
            countA+=data[j];
            flag=1;
         }
         else{                                 
            countB+=data[j];
            flag=0;
         } 
           if ((countA==21&&countB<=19) || (countA>21 && (countA-countB==2))){    //一局比赛满足胜利的情况
                        arrary[i][0]=countA;
                        arrary[i][1]=countB;
                       if(j==0){                                                  //猜解成功一次,并且分别是在第三场或者第五场胜利的时候,arrary[i][3]对
                             if(i==2||i==4){                                     //这种情况计数
                                     arrary[i][3]+=1;
                                     if((arrary[2][3]==1&&arrary[4][3]==0)||(arrary[2][3]==0&&arrary[4][3]==1))   //猜解结果从描述轨迹数组中
                                            for(j=i;j>=0;j--){                                                    //转储到结果数组中
                                                  arrary1[i-j][0]=arrary[j][0];
                                                  arrary1[i-j][1]=arrary[j][1];
                                            }
                             }
                             return;
                       }
                       
                       function(0,0,0,j-1,i+1);                                 //在一局猜解成功的基础上,进行下一局的猜解
        }
        if ((countA>=21&&(countA-countB<-1)&&flag==1&&data[j-1]!=10) || (countA>21&&(countA-countB>2)&&flag==0&&data[j-1]!=10)){ //猜解失败返回
                            return;
       }
        if(j==0)   return;                      //猜解失败返回
          if(j>0&&data[j-1]==10){               //面对  X 字符的处理 
                function(countA,countB,flag,j-1,i);     //X=10的处理过程
                if(flag==0)                             //制造连读的功能
                    flag=1;                                
                else 
                    flag=0;                  
                function(countA,countB,flag,j-1,i);   //X〉10的处理过程
         }

    }
}

代码写出来了咯
Desktop.rar (610 Bytes)


[ 本帖最后由 zhu224039 于 2014-6-29 04:20 编辑 ]

我要成为嘿嘿的黑客,替天行道
2014-06-29 03:40
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 19 楼 zhu224039
有什么感想?

总有那身价贱的人给作业贴回复完整的代码
2014-06-29 03:48
快速回复:一个用数学思想写程序的小探索记录
数据加载中...
 
   



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

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