算法竞赛入门经典 第二章

第二章学习笔记


判断一个浮点数是否为整数:

floor(m+0.5)==m     //浮点数经过运算后有可能存在误差,如0.99999,floor后为0,加上0.5才对~~


阶乘之和

计算S=1!+2!+....+n!的末六位(不含有前导0)。n<=10^6。

重要结论:要计算只包含加法,减法,乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变!

#include<stdio.h>
#define MOD 1000000
int main(){
	int s=0,n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int fac=1;
		for(int j=1;j<=i;j++)
		   fac=fac*j%MOD;
  		s=(s+fac)%MOD;
	}
	printf("%d\n",s);
}

但是程序有一个严重的问题,超时。

这是我们可以找到一个规律,就是在n比较大的时候,末六位是固定的。

只需要加上一句就搞定了,if(n>25) n=25;

比25大的话,末六位就和n=25的时候一样了。



文件操作,重定向

//首先在文件夹里面新建两个文件input.txt和output.txt
#include<stdio.h>
#define INF 100000
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int x,n=0,min=INF,max=-INF;
double s=0.0;
while(scanf("%d",&x)==1){
s+=x;
if(x<min) min=x;
if(x>max) max=x;
n++;
}
printf("The min is: %d\nThe max is: %d\nThe avg is: %.3lf\n",min,max,(double)s/n);
return 0;
}



浮点数陷阱

整数的转换是精确的,小数的转换可能出现无穷不循环小数或无限循环小数的情况。

0.1在机器中永远不能正确表达,0.1转化为二进制是无限循环数。

如:

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

输出为 死循环。以0.1为基数的数不能和10相等。可以用  i-10<0.01



习题2-1

 位数(digit

输入一个不大于10^9数,输出他的位数。用文件操作实现。

#include<fstream>
#define fin cin
#define fout cout
using namespace std;
ifstream fin("ainput.txt");
ofstream fout("aoutput.txt");
int main(){
int a,num=1;
cin>>a;
for(;;){
if(a/10!=0){
a/=10;
num++;
}
else break;
}
cout<<num;
return 0; 
} 


习题2-2

水仙花数,文件输出

#include<fstream>
#define fout cout
using namespace std;
ofstream fout("aboutput.txt");
int main(){
int x=100;
for(;x<1000;x++){
int a=x/100;
int b=x/10-a*10;
int c=x-a*100-b*10;
if(x==a*a*a+b*b*b+c*c*c)
cout<<x<<"\n";
}
return 0; 
} 


习题2-3

韩信点兵

韩信才智过人,只要让士兵先后以三人一排,五人一排,七人一排变换队形,他每次只要看排尾的人数就可以知道有多少人。输入三个整数,abc,表示每种形式排位的人数,输出总人数的最小值,已知总人数不小于10,不大于100.

#include<fstream>
#include<iostream>
using namespace std;
ofstream fout("output.txt");
int main(){
int a,b,c,i;
cin>>a>>b>>c;
for(i=10;i<=100;i++){
if(i%3==a&&i%5==b&&i%7==c)
{
fout<<i<<"\n";
break;
}
}
if(i>100) fout<<"No answer\n";
return 0;
}


习题2-4 倒三角形,输出文件形式

n=6时,输出如下

###########

 #########

  #######

   #####

    ###

     #

#include<iostream>
#include<fstream>
using namespace std;
ofstream fout("output.txt");
int main(){
int n;
cin>>n;
const int nn=n;
for(int i=0;i<nn;i++,n--){
for(int j=1;j<=i;j++)
fout<<" ";
for(int j=0;j<2*n-1;j++)
fout<<"#";
fout<<"\n";
}
return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值