算法竞赛入门经典第二版第二章习题及思考题(代码片段)

163467wyj 163467wyj     2023-01-07     798

关键词:

enmmmmmm】  大部分好像除了最后一个思考题都很简单

代码如下

#include <iostream>
#include  <cstring>
#include   <cstdio>
#include    <cmath>

int main()
    /*
    for(int i =100 ; i <= 999 ; i++)
    
        int a = i/100;int c = i%10;int b = (i-a*100)/10;//水仙花数
        if( i == pow(a,3)+pow(b,3)+pow(c,3)) WA
        //if( i == a*a*a+b*b*b+c*c*c) //AC
            printf("%d=  %d^3 + %d^3 + %d^3
",i,a,b,c);
    */
    
    /*int a,b,c,kase=1;//2-2hanxin韩信
    while(scanf("%d%d%d",&a,&b,&c) == 3 )//3 5 7
    
        int flag =0;
        printf("Case %d: ",kase++);
        a = a*70+b*21+c*15;
        while(a >= 105)
            a -= 105;
        
        if(a <=10 || a>=100 )printf("No answer
");
        else printf("%d
",a );
        //for(int i = 10;i <= 100 ; i++)
        //    if(i%3==a && i%5==b && i%7==c)
        //        printf("%d
",i);flag=1;
        //if(!flag) printf("No answer
" );

    */
    /*
    int n;scanf("%d",&n);//2-3triangle倒三角形
    for(int i = n;i >= 1 ;i--)
    
        for(int j = n-i  ;j > 0;j--)printf(" ");
        for(int j = i*2-1;j > 0;j--)printf("#");
        for(int j = n-i  ;j > 0;j--)printf(" ");
        printf("
");
    */
    /*int n,m;while( scanf("%d%d",&n,&m)==2 )
    //2-4子序列的和 subsequence
        if(n == 0 && n == m)break;
        double ans = 0.0;
        for( int i = n ; i <= m;i++)
        
            ans += (1.0/i)*(1.0/i); //直接1.0/(i*i)就炸
//sum += 1 / (((double)n + i) * ((double)n + i)); 
//在n较大时,((double)n + i) * ((double)n + i)会溢出,
//所以应该改成 1 / ((double)n + i) / ((double)n + i)
            //printf("i=%d ans=%.5lf
", i,ans);
        printf("%.5lf
", ans);//printf("%u %u
", -1,-2);
    */
    /*

        int a,b,c,n,n1;
        while(scanf("%d%d%d",&a,&b,&c)==3 && (a||b||c)) 
             
                for(int count=0; ;count++) 
                    
                     if(count) 
                         
                         if(count<=c) 
                            printf("%d",n); 
                        else 
                             
                                if(n1=a/b >= 5) n++; 
                                printf("%d",n); 
                                break; 
                             
                        n=a/b; a=(a-n*b)*10; 
                        if(count == 1) std::cout<<"."; 
                             
                    
             
    int a,b,c,kase=0,i;
    while(scanf("%d%d%d",&a,&b,&c)&&a&&b&&c)
        printf("Case %d: %d.",++kase,a/b);
        a%=b;
        for( i = 1; i < c; i++)
            printf("%d",a*10/b);
            a=a*10%b;
        
    
        if( a*10%b*10/b >= 5) a*10/b++;
          printf("%d
",a*10/b);
    */
    /*
    int a,b,c;//2-5分数化小数 decimal
    while(scanf("%d%d%d",&a,&b,&c)==3 )
        if( a== b && b==c && a==0)break;
        int aa[505],bb[505];
        aa[0] = a/b;
        aa[1] = a*10/b;

        for(int i=2; i <= c+1;i++)
        
            bb[i] = a*10%b;
            aa[i] = bb[i]*10/b;
        //printf("%d.",aa[0]);
        if(aa[c+1] >= 5 )aa[c] += 1;
        for(int i=c; i >= 1 ;i--)
            if(aa[i] == 10) 
                aa[i]-=10,aa[i-1]+1;
        printf("%d.",aa[0] );
        for(int i=1; i < c; i++)
            printf("%d",aa[i] );
        printf("%d
",aa[c]);
    
    int a,b,c;while(scanf("%d%d%d",&a,&b,&c) == 3 && a)
            //if(a <= 1e+6 && b <= 1e+6 && c <= 200 && a != 0 && b != 0 && c != 0)
            printf("%.*lf
",c,(double)a / (double)b);
        //    
    */
    /*for(int i=123; i <= 333; i++)
    //排列
        bool aa[10]=false;
        int flag =0 ;
        aa[i/100] = aa[i/10%10] = aa[i%10]=true;
        int j = i*2; int k = i*3;
        aa[j/100] = aa[j/10%10] = aa[j%10]=true;
        aa[k/100] = aa[k/10%10] = aa[k%10]=true;
        for(int d= 1; d <= 9; d++)
        
            if( aa[d] == false )
                flag=1;break;
        
        if( !flag )
            printf("%d:%d:%d
", i,j,k);
    
    int n;scanf("%d",&n);
    for(int i = 1; i <= n; i++)//for(int i = 2; i <= n; i+=2)
        printf("%d
", 2*i);*/
    double i = 0;
    for( i = 0; i != 10; i += 0.1)
    
        printf("%f", i);
    return 0;

至于最后一个思考题  浮点数陷阱

把 10 改成10.0 10.000000 啥的都没用 脑阔疼 搜了下发现了这个博客 http://blog.sina.com.cn/s/blog_6da76f9b0100yr8d.html

浮点数陷阱:
 
   之所以无限循环,那么就可以推断是for循环的条件始终成立,即 i 始终不等于10.
 
   是因为浮点数的原因. 我们把10改成10.0,结果仍然是无限循环.
 
   是浮点数的加法运算引起的.
 
   调用gdb输出中间结果来观察,发现 i 自加0.1后,并不是我们预想的等于0.1
 
   而是等于 0.10000000000000001.
 
   再往下执行几次,i 的值分别是0.20000000000000001.
 
                                          0.30000000000000004.      
 
                                          0.40000000000000002.
 
  所以程序不会终止  因为浮点数在进行小数运算的时候由于
 
   精度问题,会有很小的误差,然而用 = 或者 != 这样的运算符来比较,是会检测出这种
 
   误差的.所以导致结果的不正确. 
 
   将循环条件改为 i != 0.1 或者 i != 0.2时,程序能够正常运行,得到正常结果.但是当i != 0.3时,就是无限循环.显然,在我们的程序中,这种
 
   不确定的错误是不应该存在的.
 
   因此,在定义循环变量时,尽量采用int型及整数的加减.因为循环的本质意义就是  通过各种条件来控制语句重复运行次数.而这个次数本身就是整数.要实现小数的功能  尽量通过循环中的语句来实现. 

算法竞赛入门经典(第二版)3-3数数字uva1225(代码片段)

#include<cstdio>#include<string.h>intmain()intn;scanf("%d",&n);getchar();while(n--)charstr[10000];scanf("%s",str);intlen=strlen(str);intnum=0;for(inti=0;i<10;i++)for(intj=0;j<len;j++)if((str[j]-‘0‘)==i)num++;printf("%d",num);num=0;printf("");https://vjudge.net/problem/UVA-1... 查看详情

《算法竞赛入门经典(第二版)》pdf

...下载内容简介  · · · · · ·《算法竞赛入门经典(第2版)》是一本算法竞赛的入门与提高教材,把C/C++语言、算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧。全书内容分为12章,... 查看详情

算法竞赛入门经典(第二版)3-5谜题uva277

#include<stdio.h>#include<string.h>#definemaxn5chara[maxn][maxn];charb[100];intflag=0;//intmain()while(1)intnum=0,blank_x,blank_y;while(num<5)gets(a[num]);num++;printf("test");intx=0;//inty=0不能在这里定义,原因??while(x<5)intkey=0,y=0;while(y<5)if(a[x][y]==‘‘)... 查看详情

2021算法竞赛入门班第二节课递归分治二分练习题(代码片段)

目录华华给月月准备礼物【二分】TheBiggestWaterProblem【模拟】Bits【递归模拟/未完成】[NOIP2004]FBI树【树的后序遍历】[USACO2009DecS]MusicNotes【二分+前缀和】[NOIP2009]分数线划定【模拟】逆序数【归并排序】逆序对【组合数/推式子】... 查看详情

《算法竞赛入门经典》例题5.4.1(代码片段)

题目:现代数学的著名证明之一是GeorgCantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:第一项是1/1,第二项是是1/2,第三项是2/1,第四项是3/1,第五项是2/2,……。输入n,... 查看详情

最优化理论与算法第二版陈宝林课后习题答案

《优化理论与算法(第2版)》包括线性规划单纯形方法、对偶理论、灵敏度分析、运输问题、内点算法、非线性规划KOT条件、无约束方法、约束化方法、整数规划和动态规划等内容。《优化理论与算法(第2版)》含有大量经典... 查看详情

[算法竞赛入门]第二章_循环结构程序设计(代码片段)

第2章循环结构程序设计【学习内容相关章节】2.1for循环2.2循环结构程序设计2.3文件操作2.4小结与习题【学习目标】(1)掌握for循环的使用方法;(2)掌握while循环的使用方法;(3)学会使用计算器和累加器;(4)学会用输出... 查看详情

算法竞赛入门经典习题2-10排列(permutation)

习题2-10     用1,2,3。....,9组成3个三位数abc。def和ghi,每一个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出全部解。#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(intargc,char*ar 查看详情

算法竞赛入门经典习题2-6排列(permutation)

暴力解法:1#include<stdio.h>2#include<stdlib.h>34intcompare(constvoid*a,constvoid*b);56intmain(intargc,char**argv){7inti,j,k;8intarr[9];9for(i=100;i<333;i++){10for(j=200;j<666;j++){11for( 查看详情

算法导论第二版.pdf

...题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。算法导论第二版.pdf:https://545c.com/file186/24526445-424023275书籍来源于网络仅供学习使用如有侵权请联系删除 查看详情

算法竞赛入门经典_1.5_习题练习

1.温度问题 #include<stdio.h>intmain(){doublef,c;scanf("%lf",&f);c=5*(f-32)/9.0;printf("%.3lf ",c);return0;} 运行结果:2.平均数问题#include<stdio.h>intmain(){inta,b,c;scanf("%d%d%d",&a 查看详情

算法竞赛入门经典(刘汝佳)课后习题前三章答案

本文转载:第一章习题1-1#include <stdio.h>int main(){int a,b,c;double d;scanf("%d%d%d",&a,&b,&c);d=(double)(a+b+c);printf("%.3lf ",d/3.0);return 0;}习题1-2#include  查看详情

算法竞赛入门经典5.2stl初步(代码片段)

1.  排序和检索,学会使用sort排序,以及low_bound函数RajuandMeenalovetoplaywithMarbles.Theyhavegotalotofmarbleswithnumberswrittenonthem.Atthebeginning,Rajuwouldplacethemarblesoneafteranotherinascendingorderofthenumbersw 查看详情

[算法竞赛入门经典]crosswordanswersacm/icpcworldfinals1994,uva232(代码片段)

DescriptionAcrosswordpuzzleconsistsofarectangulargridofblackandwhitesquaresandtwolistsofdefinitions(ordescriptions).Onelistofdefinitionsisfor“words”tobewrittenlefttorightacrosswhitesquaresintherowsand 查看详情

[算法竞赛入门经典]kickdownacm/icpcneerc2004,uva1587(代码片段)

DescriptionAresearchlaboratoryofaworld-leadingautomobilecompanyhasreceivedanordertocreateaspecialtransmissionmechanism,whichallowsforincrediblyefficientkickdown—anoperationofswitchingtolowergear.After 查看详情

算法入门第二章练习题(代码片段)

 习题2-1水仙花数输出100~999中的所有水仙花数。若3位数ABC满足ABC=A2+B2+C2,则称其为水仙花数。例如:153=12+52+32,所以153是水仙花数。解析:只有1000个数,直接暴搜就好了。 1publicclassQ212publicstaticvoidmain(String[]args)3for(inti=1;i... 查看详情

算法竞赛入门经典第2版第1章(代码片段)

...步了解变量的含义  掌握变量交换的三变量法  理解算法竞赛中的程序三部曲:输入、计算、输出  记住算法竞赛的目标及其对程序的要求        &n 查看详情

机试指南第二章-经典入门-查找例题自解(代码片段)

查找:对于查找问题,有难有易。可能只是直接地对某个数字的查找,也可能涉及搜索等相对难度更大的算法。这里先介绍查找的基础概念和方法。例2.9找xAC代码:#include<cstring>#include<iostream>usingnamespacestd;intnum[205];intmain... 查看详情