算法竞赛入门 刘汝佳 例题代码及练习题代码(二)

例题2_1

#    include <stdio.h>
#   include <math.h>

int main(){
     int a,b,n;
double m;
for(a=1;a<=9;a++){
     for(b=0;b<=9;b++){
          n=1100*a+b*11;
          m=sqrt(n);
     if(floor(m+0.1)==m){
     printf("%d",n);
          }
     }
}
return 0;
}


例题2_2

#    include <stdio.h>
int step=0;
int main(){
     int n;
     scanf("%d",&n);
     while(n!=1){
          if(n%2==0){
               n=n/2;
               step++;
          }
          else{
               n=3*n+1;
               step++;
          }
          
     }
     printf("%d",step);
     return 0;
}

例题2_3
#   include <stdio.h>


int main(){
     int s=0,f=1,i=1,n;
     scanf("%d",&n);
     for(i=1;i<=n;i++){
          f=(f*i)%1000000;
          s=(s+f)%1000000;
     }
     printf("%d",s);
     return 0;
}

例题2_4
   重定向
#   define LOCAL
#  include <stdio.h>
#   define INF 1000000000
int main(){
     # ifdef LOCAL
     freopen("data.in","r",stdin);
     freopen("data.out","w",stdout);
     #endif
     int x,n=0,min=INF  ,max=-INF,s=0;
     while(scanf("%d",&x)==1){
          s+=x;
          if(x<min)min=x;
          if(x>max)max=x;
     }
     
     //     printf("x= %d min =%d max= %d",x,min ,max );
     
     return 0;
}


例题2_5  fopen

#    include <stdio.h>

#  define INF  1000000000

int main(){
     FILE *fin,*fout;
     fin=fopen("data.in","rb");
     fout=fopen("data.out","wb");
     int x,n=0,min= INF,max= -INF   ,s=0;
     while(fscanf(fin,"%d",&x)==1){
          s+=x;
          if(x<min)min = x;
          if(x>max)max = x;
          n++;
     }
     fprintf(fout,"%d %d %.3lf\n",min,max,(double)s/n);
     return 0;
}

例题2_6   浮点数的陷阱
#   include <stdio.h>

int main(){
     
     double i;
     for(i=0;i!=10;i+=0.1)
     printf("%.1lf\n",i);
     return 0;
}

/*
     实验预计
     程序输出100次停止;
     实验现象
     程序没有停下一直在运行
     实验结果
     由于double  型是浮点数存在误差,所以不能使用!=来判断 
*/

例题2_7       64位数

#   include <stdio.h>
#   include <math.h>
int count=0;
int main(){
     long long  n;
     long long  m;
     scanf("%I64d",&n);   //我现在所处的环境是windows,在windows 中MinGW  ,gcc, vc6  都是用%I64d
     m=sqrt(n);
     for(int i=1;i<=m;i++ ){
          if(n%i==0){
               count++;
          }
     }                                      //linux 中gcc 使用的都是%lld
     printf("%d",count);                                                //但是在vs2008及以上的都是用的%lld 


习题2_1
#   include <stdio.h>

int count=0;
int main(){
     int n;
     scanf("%d",&n);
     while(n){
          n=n/10;
          count++;
     }
     printf("%d",count);
     return 0;
}

习题2_2
#    include <stdio.h>

int main(){
     int a,b,c;
     for(a=1;a<=9;a++){
          for(b=0;b<=9;b++){
               for(c=0;c<=9;c++){
                    if((a*a*a+b*b*b+c*c*c)==100*a+10*b+c){
                         printf("%d\n",a*100+b*10+c);
                    }
               }
          }
     }
     return 0;
}

习题2_3

#   include <stdio.h>

int main(){
     int a,b,c,n,flag=0;
     scanf("%d%d%d",&a,&b,&c);
     for(n=10;n<=100;n++){
          if(n%3==a){
               if(n%5==b){
                    if(n%7==c){
                         printf("%d\n",n);
                         flag=1;
                         break;
                    }
               }
          }
     }
     if(flag==0){
          printf("no answer");
     }
     return 0;
}

习题2_6

#   include <stdio.h>

int main(){
     int n,i;
     double s=0,temp=0;
     scanf("%d",&n);
     for(i=1;i<=n;i++){
          temp=1.0/i;
          s=s+temp;
     }
     printf("%.3lf",s);
     return 0;
}

习题2_7
#   include <stdio.h>
#   include <math.h>

int main(){
     double flag=1.0,temp=1;
     double s=0;
     while(fabs(flag/temp)>=1e-6){
          s=s+(flag/temp);
          flag=-1*flag;
          temp=temp+2;
     }
     printf("%.3lf",4*s);
     return 0;
}
  
习题2_8
#   include <stdio.h>

int main(){
     int n,m;
     double s=0;
     scanf("%d%d",&n,&m);
     for(;n<=m;n++){
          double t=n;    //**** 
          s=s+1.0/(t*t);
     }
     printf("%.5lf",s);
     return 0;
}

/*
     这道题的题目上提示要小心陷阱
     该题给出了两组测试数据
     2 4
     结果   0.42361
     65536  655360
     结果   0.00001
     注***号的这一行如果不写的话造成错误
     65536*65536会超出int 的取值范围 
     所以应该转换成double 

*/
习题2_9
#   include <iostream>

#   include <iomanip>

using namespace std;

int main(){
     double a,b,c;
     cin>>a>>b>>c;
     cout<<fixed<< setprecision(c)<<a/b<<endl;
     return 0;
}
习题2_10
#    include <stdio.h>

int main(){
     int x,y,z,i,j,flag=0;
     int a[9];
     for(x=100;x<=333;x++){
          flag=0;       //记得每次都需要重置标志 
          y=2*x;
          z=3*x;
          a[0]=x/100;
          a[1]=x/10%10;
          a[2]=x%10;
          a[3]=y/100;
          a[4]=y/10%10;
          a[5]=y%10;
          a[6]=z/100;
          a[7]=z/10%10;
          a[8]=z%10;
          for(i=0;i<9;i++){
               for(j=i+1;j<9;j++){
                    if(a[j]==a[i]){
                         flag=1;
                    }
               }
          }
          if(flag==0){
               printf("%d %d %d\n",x,y,z);
          }
     }
     return 0;
}

猜你喜欢

转载自blog.csdn.net/haoge9551/article/details/43530073