算法笔记 2.循环(输入输出控制)

章2循环

使用常量预定义,提高可读性,易修改

C标准库:https://www.runoob.com/cprogramming/c-standard-library.html

判断完全平方数:if(sqrt(n)==(int)sqrt(n))

浮点差错解决

浮点运算会产生误差:1.floor(m+0.5)四舍五入2.用平方枚举代替开方避开误差

乘法溢出:及时取模,除得更小

浮点数误差例,不会完全等于10:

#include<stdio.h>

int main(){

         double i;

         for(i=0;i!=10.0;i+=0.1)

                  printf("%.1lf\n",i);

         return 0;

}

计时函数

会计入输入时间

Time.h

printf("time=%.2lf\n",(double)clock()/CLOCKS_PER_SEC);

避免输入时间方法:

命令行参数代替键盘输入:echo 20|exename

或赋初值

Scanf循环

Scanf返回成功输入变量个数:空格回车不计次数。结束输入Windows:ctrl+Z,Linux:ctrl+D

判断有效输出例:

#include<stdio.h>

#include<time.h>

int main(){

         int a,i=0;

         int min,max,sum=0;

         double avr;

         scanf("%d",&a);

         sum+=a;

         min=a;

         max=a;

         while(scanf("%d",&a)==1){

                  sum+=a;

                  if(a<min)min=a;

                  if(a>max)max=a;

                  i++;

         }

         avr=sum/i;

         printf("%d %d %.3lf\n",min,max,avr);

         return 0;

}

使用输入文件

使用输入文件:输入输出重定向

(与标准答案)文件比较:Windows-fe,Linux-diff

用文件输入测试,比赛提交标准IO(在编译器中定义-DLOCAL,不用临时删除预定义):

条件编译宏#ifdef 标识符;#else;#endif

重定向:

#define LOCAL

#include<stdio.h>

#include<time.h>

int main(){

#ifdef LOCAL

         freopen("data.in","r",stdin);

         freopen("data.out","w",stdout);

#endif

         int a,i=0;

         while(scanf("%d",&a)==1){

                  printf("a=%d\n",a);

         }

         return 0;

}

 

直接文件读写:

1.Dos\n就能换行,但在win下要\r\n才会回.

2.改变打开方式为rw可能可以\n

间习题2.2

#include<stdio.h>

int main(){

         FILE *fin, *fout;

         fin=fopen("data.in","rb");

         fout=fopen("data.out","wb");

         int a,i=0;

         while(fscanf(fin,"%d",&a)==1){

                  fprintf(fout,"a=%d\n",a);

         }

         fclose(fin);

         fclose(fout);

         return 0;

}

重定向法无法同时进行标准输入输出;fopen版改标准输入输出:FILE *fin=stdin,fout=stdout且不调用fopen,fclose:

重定向文件流为标准输入输出:

#include<stdio.h>

int main(){

         FILE *fin, *fout;

//     fin=fopen("data.in","rb");

//     fout=fopen("data.out","wb");

         fin=stdin;

         fout=stdout;

         int a,i=0;

         while(fscanf(fin,"%d",&a)==1){

                  fprintf(fout,"a=%d\n",a);

         }

//     fclose(fin);

//     fclose(fout);

         return 0;

}

长整型(64位):

long long,输入、出:Linux-%lld,MinGW-%I64d(大i)

C++

要在C++中使用C语言头文件:文件名前加c后.h,加using namespace std;

C++:头文件用iotream,cin>>a>>b;,cout<< a<<”\n”;也有返回值

#include<cstdio>

using namespace std;

int main(){

         int a,b;

         while(scanf("%d%d",&a,&b)==2)printf("%d\n",a+b);

         return 0; 

}

#include<iostream>

using namespace std;

int main(){

         int a,b;

         while(cin>>a>>b)cout<<a+b<<"\n";

         return 0;

}

C++文件读写:

头文件fstream

#include<fstream>

using namespace std;

ifstream fin("data.in");

ofstream fout("data.out");

int main(){

         int a,b;

         while(fin>>a>>b)fout<<a+b<<"\n";

         return 0;

}

文件流重定向到屏幕:

#include<fstream>

#include<iostream>

using namespace std;

//ifstream fin("data.in");

//ofstream fout("data.out");

#define fin cin

#define fout cout

int main(){

         int a,b;

         while(fin>>a>>b)fout<<a+b<<"\n";

         return 0;

}

输出格式

charch[20];printf("%*.*s\n",m,n,ch);可以在语句之外对参数m和n赋值,从而控制输出格式。

C++控制小数位数以及头文件:

<<fixed<<setprecision

<iomanip>

习题

2.1位数

#include<stdio.h>

//#define LOCAL

int main(){

         #ifdef LOCAL

         freopen("data.in","r",stdin);

         freopen("data.out","w",stdout);

         #endif

         int n,i=1;

         scanf("%d",&n);

         while(n/10!=0){

                  n/=10;

                  i++;

         }

         printf("%d",i);

         return 0;

}

2.2水仙花

#include<stdio.h>

int main(){

         int n,a,b,c;

         FILE *fin,*fout;

         fin=fopen("data.in","rb");

         fout=fopen("data.out","wb");

 

         for(a=1;a<10;a++){

                  for(b=0;b<10;b++){

                          for(c=0;c<10;c++){

                                   n=a*100+b*10+c;

                                   if(n==(a*a*a+b*b*b+c*c*c)){

//                                printf("%d\n",n);

                                            fprintf(fout,"\r\n%d",n);

                                   }

                          }

                  }

         }

         fclose(fin);

         fclose(fout);

         return 0;

}

2.3韩信点兵

#include<stdio.h>

int main(){

         int n,a,b,c;

         FILE *fin,*fout;

         fin=stdin;

         fout=stdout;

         fscanf(fin,"%d%d%d",&a,&b,&c);

         for(n=10;n<100;n++){

                  if((n%3==a)&&(n%5==b)&&(n%7==c)){

                          fprintf(fout,"%d",n);

                          return 0;

                  }

         }

         fprintf(fout,"No answer");

         return 0;

}

2.4倒三角形

运算式不能省略乘号

#include<cstdio>

using namespace std;

int main(){

         int n,i,j=1;

         scanf("%d",&n);

         for(;n>0;n--){

                  for(i=0;i<j;i++){

                          printf(" ");

                  }

                  for(i=0;i<(2*n-1);i++){

                          printf("#");

                  }

                  printf("\n");

                  j++;

         }

         return 0;

}

2.5统计

#include<fstream>

using namespace std;

         ifstream fin("data.in");

         ofstream fout("data.out");

int main(){

         int n,a[10],m,i,cou=0;

 

         fin>>n;

         for(i=0;i<n;i++){

                  fin>>a[i];

         }

         fin>>m;

         for(i=0;i<n;i++){

                  if(a[i]<m)cou++;

         }

         fout<<cou;

         return 0;

}

2.6调和级数

C++控制小数位数以及头文件

<<fixed<<setprecision

<iomanip>

#include<iostream>

#include<iomanip>

using namespace std;

int main(){

         int n,i;

         float sum=0;

         cin>>n;

         for(i=1;i<=n;i++){

                  sum+=1.0/i;

                 

         }

         cout<<fixed <<setprecision(3)<<sum<<endl;

         return 0;

}

2.7近似计算

注意除法两边是小数,否则编码不同

#include<iostream>

#include<fstream>

using namespace std;

#define fin cin

#define fout cout

int main(){

         int i;

         float n,res=0;

         for(i=1;;i++){

                  n=1.0/(2*i-1);

//              fout<<n<<endl;

                  if(n<(1/1000000))break;

                  if((i%2)!=0){

                          res+=n;

                  }else{

                          res-=n;

                  }

         }

         fout<<res;

         return 0;

}

2.8子序列的和

直接i*i有可能溢出

#include<stdio.h>

int main(){

         int n,m,i;

         float res=0.0;

         scanf("%d%d",&n,&m);

         for(i=0;(n+i)<=m;i++){

                  res+=(1.0/(n+i))*(1.0/(n+i));

         }

         printf("%.5f",res);

}

2.9分数化小数

#include<iostream>

#include<iomanip>

using namespace std;

int main(){

         int a,b,c;

         double res=0.0;

         cin>>a>>b>>c;

         res=1.0*a/b;

         cout<<fixed<<setprecision(c)<<res;

         return 0;

}

C解法:

printf的特殊用法:对于m.n的格式可以用如下方法表示

charch[20];printf("%*.*s\n",m,n,ch);

两个*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n。这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。#include<stdio.h>intmain(){

inta,b,c;

scanf("%d%d%d",&a,&b,&c);

printf("%.*lf\n",c,(double)a/b);

return0;}

2.10排列

#include<stdio.h>

int main(){

         int a[9],i;

         for(a[0]=1;a[0]<9;a[0]++){

                  for(a[1]=1;a[1]<9;a[1]++){

                          if(a[0]!=a[1])

                          for(a[2]=1;a[2]<9;a[2]++){

                                   if((a[0]!=a[2])&&(a[1]!=a[2])){

                                            //

                                            a[3]=2*a[0];

                                            a[6]=3*a[0];

                                            a[4]=2*a[1];

                                            a[7]=3*a[1];

                                            a[5]=2*a[2];

                                            a[8]=3*a[2];

                                            if(a[6]<=9&&(a[7]<=9)&&(a[8]<=9)){

                                                     printf("abc:");

                                                     for(i=0;i<3;i++){

                                                             printf("%d",a[i]);

                                                     }

                                                     printf(" ");

                                                     printf("def:");

                                                     for(i=3;i<6;i++){

                                                             printf("%d",a[i]);

                                                     }

                                                     printf(" ");

                                                     printf("ghi:");

                                                     for(i=6;i<9;i++){

                                                             printf("%d",a[i]);

                                                     }

                                                     printf("\n");

                                            }

                                   }

                          }

                  }

         }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值