算法竞赛--入门经典
第二章
1.100~999的水仙花数
#include<stdio.h>
#include<math.h>
int main(){
for(int i=100;i<=999;i++){
int a=i/100;
int b=(i/10)%10;
int c=i%10;
if(pow(a,3)+pow(b,3)+pow(c,3)==i)
printf("%d\n",i);
}
return 0;
}
2.韩信点兵
#include <stdio.h>
int main(){
int a,b,c;
while (scanf("%d%d%d",&a,&b,&c)==3){
int flags=1;
for (int i=10;i<=99;i++){
if (i%3==a&&i%5==b&&i%7==c){
printf("%d\n",i);
flags=0;
break;
}
}
if (flags)
printf("No answer\n");
}
return 0;
}
3.倒三角
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int m=n;
while(n){
for(int i=1;i<=m-n;i++){
printf(" ");
}
for(int j=1;j<=2*n-1;j++){
printf("#");
}
printf("\n");
n--;
}
return 0;
}
4.子序列的和
#include<stdio.h>
#include<math.h>
int main(){
long long n,m;
while(scanf("%d",&n)==1){
scanf("%d",&m);
if(m==0||n==0)
break;
double sum=0;
for(long long i=n;i<=m;i++){
sum+=(double)1/pow(i,2);
}
printf("%.5lf\n",sum);
}
return 0;
}
先输入再判断
5.分数化小数
#include<stdio.h>
int main(){
int a,b,c;
while(scanf("%d",&a)==1){
scanf("%d%d",&b,&c);
if((a==b&&a==c&&a==0)||b==0)
break;
//printf("%d %d %d\n",a,b,c);
double t=(double)a/b;
printf("%.*lf\n",c,t); //控制小数位
}
return 0;
}
补充:
%e 以指数形式输出 float 类型,输出结果中的 e 小写;
%E 以指数形式输出 float 类型,输出结果中的 E 大写;
%le 以指数形式输出double 类型;
6.排列
7.(P39)开灯问题
两种状态:
!:0 1
*-1:1 -1
#include<stdio.h>
int ans[1005];
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
ans[i]=1;
for(int i=2;i<=k;i++)
for(int j=2;j<=n;j++)
if(j%i==0)
ans[j]*=-1;
for(int i=1;i<=n;i++)
if(ans[i]==1)
printf("%d ",i);
printf("\n");
return 0;
}
#include<stdio.h>
#include<string.h>
int a[1005];
int main(){
int n,k,first=1;
scanf("%d%d",&n,&k);
memset(a,0,sizeof(a));
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
if(j%i==0)
a[j]=!a[j];
for(int i=1;i<=n;i++)
if(a[i]){
if(first)
first=0;
else
printf(" ");
printf("%d",i);
}
printf("\n");
return 0;
}
格式:
int first=1;
if(first)
first=0;
else
printf(" ");
8.蛇形填数(P39)
#include<stdio.h>
#include<string.h>
int ans[10][10];
int main(){
int n,tot,x,y;
memset(ans,0,sizeof(ans));
scanf("%d",&n);
ans[x=0][y=n-1]=tot=1;
while(tot<n*n){
while(x+1<n&&!ans[x+1][y])
ans[++x][y]=++tot;
while(y-1>=0&&!ans[x][y-1])
ans[x][--y]=++tot;
while(x-1>=0&&!ans[x-1][y])
ans[--x][y]=++tot;
while(y+1<n&&!ans[x][y+1])
ans[x][++y]=++tot;
}
for(x=0;x<n;x++){
for(y=0;y<n;y++)
printf("%3d",ans[x][y]);
printf("\n");
}
return 0;
}
二维数组——坐标:
#include<stdio.h>
#include<math.h>
int ans[110][110];
int main(){
int a,b,squ=0,ret=0;
scanf("%d%d",&a,&b);
for(int x1=0;x1<a;x1++)
for(int y1=0;y1<b;y1++)
for(int x2=x1+1;x2<=a;x2++)
for(int y2=y1+1;y2<=b;y2++){
if(abs(x1-x2)==abs(y1-y2))
squ++;
else
ret++;
}
printf("%d %d\n",squ,ret);
return 0;
}