四 程序设计题 (第1题10分,2、3题各15分,共30分)
要 求:每小题要写出算法思路、程序流程、程序编码。
1. 学校操场上有若干名学生排队,5人一行余2人,7人一行余3人,3人一行余1人,编写程序求操场至少有多少名学生。(10分)
解:
#include
int main(){
bool flag=true;
int i=0;
while(flag){
if(i%5==2 && i%7==3 && i%3==1){
printf("操场上最少有%d人",i);
flag=false;
}
i++;
}
return 0;
}
2. 银行的存款利率如下。某人有钱n元,如果要存20年时间,编程求得怎样存20年后的本利合计最多。(假定银行对定期存款过期不付利总)。(10分)
月利息率(%)
存储期限
0.63
一年
0.66
二年
0.69
三年
0.75
五年
0.84
八年
解:
#include
#include
int main() {
int i8, i5, i3, i2, i1, n8, n5, n3, n2, n1;
float max = 0, term,n=100.0;
for (i8 = 0; i8 < 3; i8++) /*穷举所有可能的存款方式*/
for (i5 = 0; i5 <= (20 - 8 * i8) / 5; i5++)
for (i3 = 0; i3 <= (20 - 8 * i8 - 5 * i5) / 3; i3++)
for (i2 = 0; i2 <= (20 - 8 * i8 - 5 * i5 - 3 * i3) / 2; i2++) {
i1 = 20 - 8 * i8 - 5 * i5 - 3 * i3 - 2 * i2;
term = n * pow((double) (1 + 0.0063 * 12), (double) i1)
* pow((double) (1 + 2 * 0.0063 * 12), (double) i2)
* pow((double) (1 + 3 * 0.0069 * 12), (double) i3)
* pow((double) (1 + 5 * 0.0075 * 12), (double) i5)
* pow((double) (1 + 8 * 0.0084 * 12), (double) i8);
/*计算到期时的本利合计*/
printf("%f ",term);
if (term > max) {
max = term;
n1 = i1;
n2 = i2;
n3 = i3;
n5 = i5;
n8 = i8;
}
}
printf("For maxinum profit,he should so save his money in a bank:\n");
printf(" made fixed deposit for 8 year: %d times\n", n8);
printf(" made fixed deposit for 5 year: %d times\n", n5);
printf(" made fixed deposit for 3 year: %d times\n", n3);
printf(" made fixed deposit for 2 year: %d times\n", n2);
printf(" made fixed deposit for 1 year: %d times\n", n1);
printf(" Toal: %.2f\n", max);
/*输出存款方式*/
}
3. 下面是一个5×5阶的螺旋方阵,编程打印出此形式的n×n (n<10)阶的方阵(顺时针方向旋进,且n为键盘输入)(15分)
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
解:
#include
int get(int x, int y, int lt, int n){
if(x == 0)
return lt+y;
else if(y == 0)
return lt+4*(n-1)-x;
else if(y == n-1)
return lt+n+x-1;
else if(x == n-1)
return lt+3*(n-1)-y;
else
return get(x-1, y-1, lt+4*(n-1), n-2);
}
int main(void){
int n, i, j;
scanf("%d", &n);
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j)
printf("%2d ", get(i, j, 1, n));
putchar('\n');
}
return 0;
}
#include <stdio.h>
int array[100][100];
void square_matrix(int left, int right, int up, int down, int v, int n)
{
int x, y, i, j, k, m;
if (left <= right) {
for (i = left; i <= right; i ++) array[up][i] = v ++;
for (k = up + 1;k < down; k ++) array[k][right] = v ++;
for (j = right; j > left; j --) array[down][j] = v ++;
for (m = down; m > up; m--) array[m][left] = v ++;
square_matrix(left + 1, right - 1, up + 1, down - 1, v, n);
} else
for (x = 0; x < n; x ++) {
for (y = 0; y < n; y ++)
printf("%4d", array[x][y]);
printf("\n");
}
}
int main(int argc, char* argv[])
{
int n;
scanf("%d", &n);
square_matrix(0, n - 1, 0, n - 1, 1, n);
return 0;
}
补充(非递归算法):
#include <stdio.h>
int main(int argc, char* argv[])
{
int a, b, c, d, i, n, num = 1, array[20][20];
scanf("%d", &n);
/* a, b, c, d分别为上、下、左、右边界,a、b为行号,c、d为列号 */
for (a=0,b=n-1,c=0,d=n-1; a<=b; a++,b--,c++,d--){
for (i = c; i <= d; i++) array[a][i] = num++;
for (i = a + 1; i < b; i++) array[i][d] = num++;
for (i = d; i > c; i--) array[b][i] = num++;
for (i = b; i > a; i--) array[i][c] = num++;
}
for (i = 0; i < n; i++) {
for (a = 0; a < n; a ++) printf("%5d", array[i][a]);
printf("\n");
}
return 0;
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29421541/viewspace-1452553/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29421541/viewspace-1452553/