第二章学习笔记
判断一个浮点数是否为整数:
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
韩信点兵
韩信才智过人,只要让士兵先后以三人一排,五人一排,七人一排变换队形,他每次只要看排尾的人数就可以知道有多少人。输入三个整数,a,b,c,表示每种形式排位的人数,输出总人数的最小值,已知总人数不小于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;
}