java相传韩信才智过人_算法竞赛入门 —— 循环结构 习题

习题2-1 水仙花数

输出100~999中的所有水仙花数。若3位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花 数。例如153=1^3+5^3+3^3,所以153是水仙花数。

#include

intmain(){for(int i = 1;i<=9;i++){for(int j = 0 ;j <=9;j++){for(int k = 0;k <= 9;k++){int r = i * 100 + j * 10 +k;if(r == i*i*i + j*j*j + k*k*k)

printf("%d\n",r);

}

}

}return 0;

}

习题2-2 韩信点兵

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组 数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c< 7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件 结束为止。

样例输入:

2 1 6

2 1 3

样例输出:

Case 1: 41

Case 2: No answer

#include

using namespacestd;intmain(){inta,b,c;intsum;

cin>>a>>b>>c;for(int i = 10;i<=100;i++){if( i%3 == a && i%5 == b && i%7 ==c){

sum=i;

cout<

}

}if(sum < 10 || sum > 100)

cout<

}

习题2-3 倒三角形

输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:

#########

#######

#####

###

#

#include

intmain(){intn;

scanf("%d",&n);for(int i =0;i < n;i++){for(int j = 0;j < i;j++)

printf(" ");for(int k = 0;k < 2 *(n-i) -1;k++)

printf("#");

printf("\n");

}return 0;

}

习题2-4 子序列的和

输入两个正整数n<m<10^6,输出

4d5e87894c48a91434eb4ec2fe1dd4b3.png,保留5位小数。输入包含多组数据, 结束标记为n=m=0。提示:本题有陷阱。

样例输入:

2 4

65536 655360

0 0

样例输出:

Case 1: 0.42361

Case 2: 0.00001

int 类型占4个字节,每个字节占8位,所以一共有32位,除去一位符号位,也就31位,能表示整数大小是2^31 次方 2^10约等于10^3 所以 2^31约等于10^9

在进行n^2 + 大数乘法 时极易溢出,所以采用__64 关键字 ————指定一个64位的整型变量

#include

intmain(){

__int64 n,m;

__int64 cas= 0;while(scanf("%I64d %I64d",&n,&m) == 2 &&n &&m){double sum = 0.0;

cas++;for(__int64 i =n;i<=m;i++){

sum+= 1.0 / (double) (i*i);

}

printf("case %I64d:%.5f\n",cas,sum);

}return 0;

}

一般来说,更适合使用 long long x; 解决此类问题

#include

intmain(){intn ;long longa,b,c;

scanf("%d",&n);int i = 1;while(n--){

scanf("%lld %lld %lld",&a,&b,&c);if(a + b >c){

printf("Case #%d: true\n",i);

}else{

printf("Case #%d: false\n",i);

}

i++;

}return 0;

}

习题2-5 分数化小数

输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤10^6,c≤100。输 入包含多组数据,结束标记为a=b=c=0。

样例输入:

1 6 4

0 0 0

样例输出:

Case 1: 0.1667

#include#include

using namespacestd;intmain(){inta,b,c;while(true){

cin>>a>>b>>c;if(a ==0 && b==0 && c==0)break;

printf("%.*f\n",c,(double) a /b);

}return 0;

}//类似的—————— printf("%*.*f\n", m, n, ch); 前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n

习题2-6 排列

用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必 太动脑筋。

#include

intmain(){inta,b,c,d,e,f,g,h,i;for(a=1;a<=9;a++)for(b=1;b<=9;b++)for(c=1;c<=9;c++)for(d=1;d<=9;d++)for(e=1;e<=9;e++)for(f=1;f<=9;f++)for(g=1;g<=9;g++)for(h=1;h<=9;h++)for(i=1;i<=9;i++)if(2*(a*100+b*10+c) == d*100+e*10+f && 3*(a*100+b*10+c) == g*100+h*10+i&& 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!=e && c!=f && c != g && c != h && c!=i&& d!=e && d!=f && d != g && c!= 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 %d %d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);return 0;

}

下面是一些思考题。

题目1。假设需要输出2,4,6,8,…,2n,每个一行,能不能通过对程序2-1进行小小 的改动来实现呢?为了方便,现把程序复制如下:

#include

intmain()

{intn;

scanf("%d", &n);for(int i = 1; i <= n; i++)

printf("%d\n", i);return 0;

}

修改后:

#include

intmain()

{intn;

scanf("%d", &n);for(int i = 1; i <= n; i++)

printf("%d\n", i*2);return 0;

}

任务1:修改第7行,不修改第6行。

#include

intmain()

{intn;

scanf("%d", &n);for(int i = 1; i <= n; i++)

printf("%d\n", i*2);return 0;

}

任务2:修改第6行,不修改第7行。

#include

intmain()

{intn;

scanf("%d", &n);for(int i = 2; i <= n*2; i+=2)

printf("%d\n", i);return 0;

}

题目2。下面的程序运行结果是什么?“!=”运算符表示“不相等”。提示:请上机实 验,不要凭主观感觉回答。

#include

intmain()

{doublei;for(i = 0; i != 10; i += 0.1)

printf("%.1f\n", i);return 0;

}

47533e87b33699dd423bdd890e2f1e07.png

1e71b733db9966ab89d29d7d37ebcfbf.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值