第二章
习题2-1水仙花数
输出100-999中的所有水仙花数。若三位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花数。例如153=1^3+5^3+3^3,所以153是水仙花数。
#include<stdio.h>
int main(){
int i,a,b,c;
for(i=100;i<=999;i++){
a=i/100;
b=(i%100)/10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c){
printf(“%d”,i);
}
}
return 0;
}
习题2-2 韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100.输入到文件结束为止。
第一种算法(枚举法)
#include<stdio.h>
int main(){
int i=10;
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
while(i<100){
if((i%3==a)&&(i%5==b)&&(i%7==c){
printf("%d",i);
}
}
printf("No answer");
}
第二种算法:
#include<stdio.h>
int main(){
int m;
int a,b,c;
scanf("%d%d%d,&a,&b,&c)
m=(a*70+b*21+c*15);
if(m>105){
m=m%105;
printf("%d",m);
return 0;
}
}
printf("No answer");
}
2-3倒三角形
输入正整数n<=20,输出一个n层的倒三角形。例如,n=5时输出如下:
#########
#######
#####
###
#
#include<stdio.h>
int main(){
int n,i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf(“ ”);
for(k =i;k<=2*n-i;k++){
printf("#");
}
printf("\n");
}
}
习题2-4 子序列的和
代码如下:
#include<stdio.h>
int main(){
int n,m,temp,ans=0;
while(~scanf("%d%d",&n,&m)){
double sum=0;
if(n>m){temp=n;n=m;m=temp;}
if(n==0&&m==0)break;
for(int i=n;i<=m;i++){
sum=sum+1.0/i/i;;
}
printf("Case %d:%.5f\n",sum);}
return 0;
}
习题2-5分数化小数
输入正整数a,b,c,输出a/b的小数形式。精确到小数点后c位。a,b<=10^6,c<=100.输入包含多组数据,结束标记为a=b=c=0;
代码如下:
#include<stdio.h>
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%*.*f\n",c,(ouble)a/b);
return 0;
}
printf
的特殊用法
:
对于
m.n
的格式可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前边的
*
定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数
m
和
n
。
这
种方法的好处是可以在语句之外对参数
m
和
n
赋值,从而控制输出格式。
printf
的特殊用法
:
对于
m.n
的格式可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前边的
*
定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数
m
和
n
。
这
种方法的好处是可以在语句之外对参数
m
和
n
赋值,从而控制输出格式。
printf的特殊用法:对于m.n的格式可以用如下方法表示
char ch[20]; printf("%*.*s\n",m,n,ch);
前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。*表示不确定的变量,可以用变量的值替代。
这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式.
习题2-6排列(permutaion)
用1,2,3.....,9组成三位数abc,def,ghi,每个数字恰好使用一次,要求 abc:def:ghi=1:2:3.按照“abc def ghi”的格式输出所有解,每行一个解。
代码如下:
#include<stdio.h>
#define FOR(i) for(i=1;i<10;i++)
int main(){
int a,b,c,d,e,f,g,h,i;
FOR(a){
FOR(b){
FOR(c){
FOR(d){
FOR(e){
FOR(f){
FOR(g){
FOR(h){
FOR(i){
if(2*(a*100+b*10+c)==(d*100+e*10+f)&&3*(a*100+b*10+c)==(g*100+h*10+i)){
if((a!=b)&&(a!=c)&&(a!=d)&&(a!=e)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=i)&&(b!=c)&&(b!=d)&&(b!=e)&&(b!=f)&&(b!=g)&&(b!=h)&&(b!=i)&&(c!=d)&&(c!=d)&&(c!=e)&&(c!=f)&&(c!=g)&&(c!=h)&&(c!=i)&&(d!=e)&&(d!=f)&&(d!=g)&&(d!=h)&&(d!=i)&&(e!=f)&&(e!=g)&&(e!=h)&&(e!=i)&&(f!=g)&&(f!=h)&&(f!=i)&&(g!=h)&&(g!=i)&&(h!=i)){
printf("%d\n%d\n%d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);
}
}
}
}
}
}
}
}
}
}
}
}