目录
(一)顺序程序设计部分
1. 使用getchar读入两个字符,并分别用putchar和printf函数输出。
解题思路:明确putchar和getchar的用法。
#include<stdio.h>
int main() {
//使用getchar读入两个字符,并分别用putchar和printf函数输出
char c1, c2;
printf("请输入两个字符:");
c1=getchar();
c2=getchar();
printf("用putchar输出结果如下:\n");
putchar(c1);
putchar(c2);
printf("\n");
printf("用printf输出结果如下:\n");
printf("%c %c", c1, c2);
return 0;
}
(二)选择程序设计部分
1. 有一个函数,当x<1时,y=x;当1<=x<10时,y=2*x-1;当x>=10时,y=3*x-11.
要求:写程序,输入x的值,输出y相应的值。
解题思路:可以使用if-else等多分支语句来处理不同的x值,使其进行不同的运算。
#include<stdio.h>
int main() {
//根据函数,输入一个x值,就会输出对应的y值
int x, y;
printf("请输入一个x值:\n");
scanf("%d", &x);
if (x < 1) {
y = x;
}
else if (x >= 1 && x < 10) {
y = 2 * x - 1;
}
else {
y = 3*x - 11;
}
printf("y值为:%d", y);
return 0;
}
2. 给一个不多于5位的正整数,要求:
1)求出它是几位数
2)分别输出每一位数字
3)按逆序输出各位数字,例如原数为321,应输出123.
解题思路:首先接收这个正整数,通过跟特定的数进行大小判断来判断它是几位数。接着利用除法求余等算术运算来输出每一位数字。
#include<stdio.h>
int main() {
//给出一个不多于5位数的正整数
int num;
printf("请输入一个不多于5位数的正整数:\n");
scanf("%d", &num);
int flag, ge, shi, bai, qian, wan;
if (num > 0 && num < 10) {
flag = 1;
}
else if (num >= 10 && num < 100) {
flag = 2;
}
else if (num >= 100 && num < 1000) {
flag = 3;
}
else if (num >= 1000 && num < 10000) {
flag = 4;
}
else {
flag = 5;
}
wan = num / 10000;
qian = num / 1000 % 10;
bai = num / 100 % 10;
shi = num / 10 % 10;
ge = num % 10;
printf("这是一个%d位数\n", flag);
switch (flag) {
case 1:
printf("原数的每一位上面的数字为:%d\n", ge);
printf("逆序输出结果为:\n");
printf("%d", ge);
break;
case 2:
printf("原数的每一位上面的数字为:%d %d\n", shi, ge);
printf("逆序输出结果为:\n");
printf("%d %d", ge, shi);
break;
case 3:
printf("原数的每一位上面的数字为:%d %d %d\n", bai, shi, ge);
printf("逆序输出结果为:\n");
printf("%d %d %d", ge, shi, bai);
break;
case 4:
printf("原数的每一位上面的数字为:%d %d %d %d\n", qian, bai, shi, ge);
printf("逆序输出结果为:\n");
printf("%d %d %d %d", ge, shi, bai, qian);
break;
case 5:
printf("原数的每一位上面的数字为:%d %d %d %d %d\n", wan, qian, bai, shi, ge);
printf("逆序输出结果为:\n");
printf("%d %d %d %d %d\n", ge, shi, bai, qian, wan);
break;
default:
printf("输入有误,请输入正确的数字!\n");
break;
}
return 0;
}
(三)循环程序设计部分
1. 输入两个正整数m和n,求其最大公约数和最小公倍数。
解题思路:求最大公约数可用辗转相除法,求最小公倍数,可由这两个数的乘积再除以这两个数的最大公约数。
#include<stdio.h>
int main() {
//求两个正整数的最大公约数和最小公倍数
//最大公约数用辗转相除法,最小公倍数用两数相乘再除以最大公约数来求
int n, m;
printf("请输入两个正整数:\n");
scanf("%d,%d", &n, &m);
if (n < m) {
int temp = n;
n = m;
m = temp;
}
int p = n * m;
int r = n % m;
while (r!= 0) {
n = m;
m = r;
r = n % m;
}
p = p / m;
printf("最大公约数为:%d", m);
printf("最小公倍数为:%d", p);
return 0;
}
2. 求1!+2!+3!+...+20!的值
解题思路:除了1以外,每个数的阶乘都是前一个数的阶乘再乘以这个数。
#include<stdio.h>
int main() {
//求1到20每个数的阶乘的和
int sn = 1, n = 1;
int sum = 0;
while (n <= 20) {
sum += sn;
++n;
sn = sn * n;
}
printf("这20个数的阶乘和为:%d", sum);
return 0;
}
3. 有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13...
求出这个数列的前20项和。
解题思路:从第二项开始,每一项的分子都是前一个数的分子分母之和,分母则是上一个数的分子。
#include<stdio.h>
int main() {
//求一个特殊分数序列的前20项和
double m = 2.0, n = 1.0, sum = 2.0;
for (int i = 1; i < 20; i++) {
int temp = m;
m = n + m;
n = temp;
sum += m / n;
}
printf("结果为%f", sum);
return 0;
}
4. 用牛顿迭代法求下面方程在1.5附近的根:
解题思路:牛顿迭代法又称牛顿切线法,它采用以下的方法求根:先任意设定一个与真实的根接近的值x0,作为第1次近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把x1作为第2次近似根,再由x1求出f(x1),过(x1,f(x1))做f(x)的切线,交x轴于x2,再求出f(x2),再做切线。。。如此继续下去,知道足够接近真正的根x*为止.
#include<stdio.h>
#include<math.h>
int main() {
//用牛顿迭代法求一个方程在1.5附近的根
double x0 = 1.5, x1;
x1 = x0 - (((2 * x0 - 4) * x0 + 3) * x0 - 6) / ((6 * x0 - 8) * x0 + 3);
do {
x0 = x1;
x1 = x0 - (((2 * x0 - 4) * x0 + 3) * x0 - 6) / ((6 * x0 - 8) * x0 + 3);
} while (fabs(x1 - x0) >= 1e-5);
printf("the root of equation is %10.2f", x1);
return 0;
}
(四)数组处理数据部分
1. 用筛选法求100以内的素数。
解题思路:所谓“筛选法”指的就是“埃拉托色尼筛法”。埃拉托色尼是古希腊的著名数学家。他采取的方法是,在一张纸上写上1~1000的全部整数,然后逐个判断它们是否素数,找出一个非素数,就把它挖掉,最后剩下的就都是素数。
具体做法可归结为:
1)先将1挖掉(因为1不是素数)
2)用2除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉
3)用3除它后面的个数,把3的倍数挖掉
4)分别用4,5。。。各数作为除数除这些数后面的各数。这个过程一直进行到在除数后面的数已全部被挖掉为止。
#include<stdio.h>
#include<math.h>
int main() {
//利用筛选法求100以内的素数
int str[100];
for (int i = 1; i <= 100; i++) {
str[i - 1] = i;
}
str[0] = 0; //将1给排除,因为1不是素数
for (int i = 1; i <= sqrt(100); i++) {
for (int j = i+1; j <100; j++) {
if (str[i]!=0&&str[j] != 0) {
if (str[j] % str[i] == 0) {
str[j] = 0;
}
}
}
}
int count = 0;
for (int i = 0; i < 100; i++) {
if (str[i] != 0) {
printf("%d\t", str[i]);
count++;
if (count % 10 == 0) {
printf("\n");
}
}
}
return 0;
}
2. 求一个3*3的整型矩阵对角线元素之和
解题思路:利用二维数组,对在对角线上的元素进行相加。
#include<stdio.h>
int main() {
//求一个3*3的整型矩阵对角线元素之和
int str[3][3];
int sum = 0;
printf("请依次输入这个矩阵元素值:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
scanf("%d", &str[i][j]);
if (i == j) {
sum = sum + str[i][j];
}
}
}
printf("这个矩阵对角线元素之和为:%d", sum);
return 0;
}
3.有一个已经排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。
解题思路:可假设这个数组是按照从小到大进行排序的。首先比较最后一个元素,如果这个数大于最后一个元素,就把它插入到数组的最后。如果小于,那么从前面第一个元素比较,看是否小于这个元素,如果小于,就把这个位置的元素以及其后的元素都往后面移动一个位置。
#include<stdio.h>
#include<string.h>
int main() {
//已有一个已经排好序的数组,要求插入一个数后,原来的排序规律不变
int arr[11] = { 11,22,33,44,55,66,77,88,99,100 };
int len = sizeof(arr) / sizeof(arr[0]);
int num;
printf("数组长度为:%d\n", len);
printf("请输入要插入的数:\n");
scanf("%d", &num);
if (num > arr[len - 2]) {
arr[len-1] = num;
printf("插入一个数后的数组为:\n");
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
for (int i = 0; i<arr[len-2]; i++) {
if (num < arr[i]) {
for (int j = len-1; j>i; j--) {
arr[j] = arr[j - 1];
}
arr[i] = num;
break;
}
}
printf("插入一个数后的数组为:\n");
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
4. 输出十行杨辉三角。
解题思路:明确杨辉三角的实质,即各行的第一个数都是1,各行的最后一个数都是1。从第三行开始,中间的数都是上一行同列和前一列的两个数之和。
#include<stdio.h>
int main() {
//要求输出10行的杨辉三角
int arr[10][10]; //10行10列
for (int i = 0; i < 10; i++) {
arr[i][i] = 1;
arr[i][0] = 1;
}
for (int i = 2; i < 10; i++) {
for (int j = 1; j <=i-1; j++) {
arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
}
}
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
printf("%3d", arr[i][j]);
}
printf("\n");
}
return 0;
}
5. 输出“魔方阵”。所谓魔方阵就是指这样的方阵,它的每一行,每一列和对角线之和均相等。要求输出1~n*n的自然数构成的魔方阵。
解题思路:魔方阵的排列规律为:首先1必须放在第一行的中间一列,这也就要求我们魔方阵的阶数必须是奇数。然后其余数都放前一个数的上一行后一列。如果位置已有元素,那么这个数就放在前一个数的下面。
#include<stdio.h>
int main() {
//输出一个1~n*n的魔方阵
int arr[15][15];
int n;
printf("请输入n的值(1~15内的奇数):\n");
scanf("%d", &n);
//判断输入n的值是否正确
if (n <= 0 || n > 15 || n % 2 == 0) {
printf("您输入的n值有误,请重新输入!");
return 1;
}
//初始化这个方阵都为0
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = 0;
}
}
int h = 0, l = n / 2;
int num = 1;
while (num <= n * n) {
arr[h][l] = num++;
int h1 = h - 1;
int l2 = l + 1;
if (h1 == -1 && l2 == n) {
h1 = n - 1;
l2 = 0;
}
else if (h1 == -1) {
h1 = n - 1;
}
else if (l2 == n) {
l2 = 0;
}
//处理填充位置已经满了的情况
if (arr[h1][l2] != 0) {
h1 = h + 1;
l2 = l;
}
h = h1;
l = l2;
}
//打印这个魔方阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
6. 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。
解题思路:可以先求出每一行的最大值,然后再判断是不是这一列中最小值。设置一个标志来判断这个二维数组是否包含鞍点。
#include<stdio.h>
int main() {
//找出一个数组中的鞍点
int arr[4][5] = {
{1,2,3,4,5},
{2,4,21,8,9},
{3,6,9,12,15},
{4,8,12,16,20}
};
int flag = 1, lie = 0;
for (int i = 0; i < 4; i++) {
int max = arr[i][0];
lie = 0;
flag = 1;
for (int j = 1; j < 5; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
lie= j;
}
}
for (int k = 0; k < 4; k++) {
if (max>arr[k][lie]) {
flag = 0;
break;
}
}
if (flag == 1) {
printf("这个数组有鞍点,鞍点为%d", max);
printf("位于arr[%d][%d]", i, lie);
//break; //这里break的作用可用来控制鞍点的个数
}
}
return 0;
}
7. 有一行电文,已按下面规律译成密码:A→ Z, a→z,B→Y,b→y,C→X,c→x...。即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。
解题思路:利用ASCII码来判断是第几个字母,然后再将其进行处理。
#include<stdio.h>
#include<string.h>
int main() {
//将一行电文密码遵循一定的规则翻译回原文
char password[100];
char account[100];
printf("请输入一行电文密码:\n");
fgets(password, sizeof(password), stdin);
int len = strlen(password);
for (int i = 0; i < len; i++) {
printf("%c", password[i]);
}
printf("\n");
for (int i = 0; i < len; i++) {
if (password[i] >= 'A' && password[i] <= 'Z') {
password[i] = 155 - password[i];
}
else if (password[i] >= 'a' && password[i] <= 'z') {
password[i] = 219 - password[i];
}
else {
continue;
}
}
printf("该电文密码的原文为:\n");
for (int i = 0; i < len; i++) {
printf("%c", password[i]);
}
return 0;
}
标签:arr,num,int,精选,潭浩强,printf,程序设计,x0,include From: https://blog.csdn.net/2303_78660417/article/details/141678187