//程序 2-2 7744问题(1)
#include <stdio.h>
#include <math.h>
int main() {
for(int a=1; a<=9; a++)
for(int b=0; b<=9; b++) {
int n =a*1100+b*11;
int m=floor(sqrt(n)+0.5);//对四舍五入的处理,因为浮点计算误差
if (m*m==n)printf("%d\n",n);
}
return 0;
}
//程序 2-3 7744问题(2)
#include <stdio.h>
int main() {
for(int x=1;; x++) {
int n=x*x;
if(n<1000) continue;
if(n>9999) break;
int hi=n/100;
int lo=n%100;
if(hi/10==hi%10&&lo/10==lo%10) //最高位==第二位 后两位相等
printf("%d\n",n);
}
return 0;
}
//程序2-5 3n+1 问题
#include <stdio.h>
int main() {
int n2,count=0;
scanf("%d",&n2);
long long n=n2;
while(n>1) {
if(n%2==1)
n=n*3+1;
else
n/=2;
count++;
}
printf("%d\n",count);
return 0;
}
//程序 2-6 近似计算
#include <stdio.h>
int main() {
double sum=0;
int i=0;
double term;
do {
term=1.0/(i*2+1);
if(i%2==0)sum+=term;
else sum-=term;
i++;
} while(term>=(1e-6));
printf("%.6lf\n",sum);
return 0;
}
//程序 2-7 阶乘之和(1) 会溢出且速度慢
#include <stdio.h>
int main() {
int n,s=0;
scanf("%d",&n);
for(int i=1; i<=n; i++) {
int factorial=1;
for(int j=1; j<=i; j++) factorial*=j; //计算阶乘
s+=factorial;
}
printf("%d\n",s%1000000);
return 0;
}
//程序 2-8 阶乘之和(2)
#include <stdio.h>
#include <time.h>
int main() {
const int MOD=1000000;
int n,s=0;
scanf("%d",&n);
for(int i=1; i<=n; i++) {
int factorial=1;
for(int j=1; j<=i; j++) factorial=(j* factorial%MOD); //计算阶乘
s=(factorial+s%MOD);//在只有加减乘的运算中,要计算余数,可以在每步之后计算
}
printf("%d\n",s);
printf("time usde=%.2f\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
//程序 2-10 数据统计(重定向版本)
#define LOCAL //只有定义了LOCAL 才能编译freopen
#include <stdio.h>
#define INF 100000000
int main() {
#ifdef LOCAL
freopen("data.txt","r",stdin);
freopen("data.txt","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\n",x,min,max); 测试中间变量
n++;
}
printf("%d%d%.3f\n",min,max,(double)s/n);
return 0;
}
//程序 2-11 数据统计(fopen版本)
#include <stdio.h>
#define INF 100000000
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 %.3f\n",min,max,(double)s/n);
fclose(fin);//关闭文件
fclose(fout);
return 0;
}
算法竞赛入门经典(第二版)第二章教材代码
最新推荐文章于 2024-08-02 11:38:25 发布