今天有个大佬对我说,像我这样没有扎实的算法知识基础,甚至c语言连略知一二的程度都到不了,学得快,忘得更快,不能只为了竞赛去学习。所以我决定从新复习一下c语言基础,和算法与数据结构的基础知识,不光是为了准备比赛,更是为了以后的学习
Circulate(while,do while,for)
.1 daffodil 水仙花数
输出100~999中的所有水仙花数。若3位数ABC满足ABC=A3+B3+C3,则称其为水仙花 数。例如153=13+53+33,所以153是水仙花数。
code:
#include<stdio.h>
int main()
{
int i;
int a,b,c;
for(i=100;i<1000;i++)
{
a=i/100;
b=i%100/10;
c=i%100%10;
if(a*a*a+b*b*b+c*c*c==i)
printf("%d ",i);
}
return 0;
}
.2 hanxin 韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人 一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组 数据,每组数据包含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
code:
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d", &a, &b, &c)
for (int i = 10; i < 100; i++)
{
if (i % 3 == a && i % 5 == b && i % 7 == c)
{
printf("%d", i);
return 0;
}
}
if(i==101)
printf("No answer");
return 0;
}
.3 triangle 倒三角
输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
code:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < i; j++)
printf(" ");
for (j = 0; j < 2 * (n - i) - 1; j++)
printf("#");
printf("\n");
}
return 0;
}
.4 subsequence 子序列的和
输入两个正整数n<m<106,输出 ,保留5位小数。输入包含多组数据, 结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001
code:
#include<stdio.h>
int main()
{
int n, m,cnt=0;
while (scanf("%d%d", &n, &m))
{
if (n == 0 && m == 0)
break;
else
{
cnt++;
double i;
double sum = 0;
for (i = n; i <= m; i++)
sum += 1 / i / i;//注意,n过大的话相乘会溢出
printf("case%d:%.5f", cnt,sum);
}
}
return 0;
}
.5 decimal 分数化小数
输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。输 入包含多组数据,结束标记为a=b=c=0。
样例输入:
1 6 4
0 0 0
样例输出:
Case 1: 0.1667
这题就比较有意思了,本来抱着复习c基础的心态来做练习,结果发现了一道模拟题。注意此题的c范围是小于等于一百,double的最大范围才是16位,所以我们要拿出小学做除法时的方法,乘10错位再取余。(记得要多算一位,用来四舍五入)
code:
#include<stdio.h>
int main()
{
int a, b, c,cnt=0,sd[1000],d,h;
while (scanf("%d%d%d", &a, &b, &c))
{
if (a == 0 && b == 0 && c == 0)
break;
else
{
cnt++;
int n = a / b;
printf("case %d:%d.",cnt,n);
for (int i = 0; i <= c; i++)//多算一位
{
a *= 10;
sd[i] = a / b;
a %= b;
}
if (sd[c] >= 5)
sd[c - 1] += 1;
for (int i = 0; i < c; i++)
printf("%d",sd[i]);
}
}
return 0;
}
.6 permutation(排列)
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要 求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必 太动脑筋。
既然题目既没规定时空复杂度,又让咱不动脑子,那么我只好恭敬不如从命,用九层大循环+判断N连 来搞定它了!!!
死亡代码:
#include <stdio.h>
int main()
{
int a, 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) == 1 * (d * 100 + e * 10 + f)) && (3 * (a * 100 + b * 10 + c) == 1 * (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) && (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 %d %d\n", a * 100 + b * 10 + c, d * 100 + e * 10 + f, g * 100 + h * 10 + i);
}
}
}
}
}
}
}
}
}
}
return 0;
}
一天一节,循序渐进。