C语言编程题
- 1.编写程序,从键盘输入x的值(要求为整型),根据如下公式计算,并输出x和y的值;
- 2.编写程序,键盘输入一组整数(最大为18位数), 判断它是不是回文数,如果一个自然数和它的个位数字 反向排列所得自然数相等,则称这个数为回文数, 例如,52425和138831是回文数,而12312非回文数;
- 3.编写程序,输出一个n*n矩阵A(n由键盘输入),输出矩阵A的转置矩阵B;
- 4.编写程序,输入一个整数n,汇出由*组成的边长为n的菱形
- 5.编写程序,输入一个正整数n,求13的n次方的后三位数;
- 6.一个正整数如果恰好等于它的因子之和,这个数就称为"完数", 例如6=1+2+3,编写程序求100之内的所有完数;
- 7.计算100以内的和
- 8.找出100到999之间所有的水仙花数
- 8.蛇形矩阵
- 9.字符逆序输出
- 10.猜谜语,扣金币
- 11.公鸡5元1只,母鸡3元1只,小鸡1元3只, 100元要买100只鸡,且必须包含公鸡、母鸡、 小鸡。编写程序,输出所有可能的方案。
- 12.编写程序,在一个二维数组a中选出各行最大的元素组成一个一维数组b
- 13.耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒, 请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号 :1,2,3,1,2,3...。凡是报到“3”就退出圈子, 最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。
- 14.c语言编写程序:输入三角形的三条边, 判断它们能否构成三角形, 若能则指出何种三角形.
- 15.有一个数学等式:ab\*cd=ba\*dc,式中的一个字母代表一位数字, 编写程序,找出所有符合上述要求的乘积式并打印输出
- 16.一个偶数总能表示为两个素数之和,请输入任意一个偶数,并把它表 示为两个素数的和,例如输入偶数18,则只要输出18=5+13可, 18=7+11可以不计算
- 17.输入N个元素的整数数组,然后将其前面各元素按照顺序向后移 m个位置,最后m个数变成最前面的m个数
- 18.编写程序,已知一个整数数列A中的每个项为其前3个项之和, 请输入数列前3项的值,求此数列的前30项,要求:前3项的值由键盘 输入,如输入1,2,3则数列为1 2 3 6 11 20 37 ......
- 19.一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。
- 20.有一个长度为n的整数数组,找出其中出现次数最多的数m
- 21.有一个 4*4的矩阵,求出该矩阵的两条对角线元素的和
- 22编写计算多项式的值,输入N的值输出最终结果
- 23,输入n(0
1.编写程序,从键盘输入x的值(要求为整型),根据如下公式计算,并输出x和y的值;
/*
1.编写程序,从键盘输入x的值(要求为整型),根据如下公式计算,
并输出x和y的值;
╭
│ x x<2
│ x²+1 2≤x<6
y=‹ √x+1 6≤x<10
│ 1
│ ----- x≥10
│ x+1
╰
*/
#include<stdio.h>
#include<math.h>
int main() {
int x;
double y = 0;
scanf_s("%d",&x);
if (x<2) {
y = x;
printf("x=%d y=%f",x,y);
}
else if (x>=2&&x<6) {
y = (double)x * x + 1;
printf("x=%d y=%f", x, y);
}
else if (x >= 6 && x < 10) {
y = sqrt((double)x+1);
printf("x=%d y=%f", x, y);
}
else if (x >= 10) {
y = 1.0/((double)x+1);
printf("x=%d y=%f", x, y);
}
return 0;
}
2.编写程序,键盘输入一组整数(最大为18位数), 判断它是不是回文数,如果一个自然数和它的个位数字 反向排列所得自然数相等,则称这个数为回文数, 例如,52425和138831是回文数,而12312非回文数;
/*
2.编写程序,键盘输入一组整数(最大为18位数),
判断它是不是回文数,如果一个自然数和它的个位数字
反向排列所得自然数相等,则称这个数为回文数,
例如,52425和138831是回文数,而12312非回文数;
*/
#include<stdio.h>
int main()
{
//int a = 12345;
//int sums = 0;
//for (int i = 0; i < 7;i++) {
// int tmp = a % 10;
// printf("a%%10=%d\n",tmp);//取个位
// printf("a/10=%d\n",a/=10);//去掉一位
// sums = sums * 10 + tmp;//每多一位数字上一个数乘10+个位
// printf("sum=%d\n",sums);
//}
int n; //用户输入的正整数
int tmp; //临时存储每一位数
int sum = 0; //组合后的数
printf("输入一个数:\n");
scanf_s("%d", &n);
//数位遍历
for (int i = n; i; i /= 10)
{
tmp = i % 10;
sum = sum * 10 + tmp;
}
printf("%d\n", sum);
if (sum == n)
{
printf("这个数是回文数。\n");
}
else {
printf("这个数不是回文数。\n");
}
return 0;
}
3.编写程序,输出一个n*n矩阵A(n由键盘输入),输出矩阵A的转置矩阵B;
/*
3.编写程序,输出一个n*n矩阵A(n由键盘输入),输出矩阵A的转置矩阵B;
*/
#include<stdio.h>
int main() {
int n, a[101][101];
//输入n的值 确定为几乘几的矩阵
scanf_s("%d",&n);
//循环输入为数组赋值
for (int i = 0; i < n;i++) {
for (int j = 0; j < n; j++) {
scanf_s("%d",&a[i][j]);
}
}
//循环遍历输出
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j==n-1) {
printf("%d\n", a[j][i]);
}
else {
printf("%d ", a[j][i]);
}
}
}
return 0;
}
4.编写程序,输入一个整数n,汇出由*组成的边长为n的菱形
/*
4.编写程序,输入一个整数n,汇出由*组成的边长为n的菱形,例如输入n=5,
*
* *
* *
* *
* *
* *
* *
* *
*
*/
#include<stdio.h>
int main() {
int n;
scanf_s("%d", &n);
//正三角形
for (int i = 1; i <= n; i++) { //控制行数
//遍历打出菱形左边的空格n=5时4 3 2 1
for (int j = n-i; j >0; j--) {
printf(" ");
}
//2i-1 = 1 3 5 7
for (int j = 1; j <= 2 * i - 1; j++) {
if (j==1||j==2*i-1) {//判断第一个和最后一个输出*
printf("*");
}
else {//其他输出空格
printf(" ");
}
}
printf("\n");
}
//倒三角形
for (int i = n-1; i >0; i--) {
for (int j = n - i; j > 0; j--) {
printf(" ");
}
for (int j = 2*i-1; j >0; j--) {
if (j == 1 || j == 2 * i - 1) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
5.编写程序,输入一个正整数n,求13的n次方的后三位数;
/*
编写程序,输入一个正整数n,求13的n次方的后三位数;
*/
#include<stdio.h>
int main() {
int n, z = 1;
scanf_s("%d",&n);
for (int i = 1; i <= n;i++) {//控制次数
z = z * 13 % 1000; //取后三位 公式
}
printf("13的%d次方的最后三位数是:%d\n", n, z);
return 0;
}
6.一个正整数如果恰好等于它的因子之和,这个数就称为"完数", 例如6=1+2+3,编写程序求100之内的所有完数;
/*
一个正整数如果恰好等于它的因子之和,这个数就称为"完数",例如6=1+2+3,
编写程序求100之内的所有完数;
*/
#include<stdio.h>
int main() {
int sum;
for (int i = 1; i <= 100;i++) { //循环控制1到100
sum = 0;
for (int j = 1; j < i;j++) {
if (i%j==0) { //得到因子数
sum += j; //因子和
}
}
if (sum==i) { //判断因子和等于本身
printf("sum=%d\n",sum);
}
}
return 0;
}
7.计算100以内的和
#include<stdio.h>
int main() {
//需求1:计算1+2+3+4+...100的结果
int x = 0;
for (int i = 1; i <= 100; i++) {
x = x + i;//x+=i;
printf("%d",x);
}
return 0;
}
8.找出100到999之间所有的水仙花数
#include<stdio.h>
int main() {
//需求2:找出100到999之间所有的水仙花数(153 = 1*1*1 + 5*5*5 +3*3*3)
int g,s,b;
for (int i = 100; i < 1000; i++) {
g = i % 10; //各位
s = i % 100 / 10; //十位
b = i / 100; //百位
if (i == g * g * g + s * s * s + b * b * b) {
printf("%d\n",i);
}
}
return 0;
}
8.蛇形矩阵
#include<stdio.h>
//解题思路:
//(1)1 3 6 10 15 1 + (2)-- > 3 + (3)-- > 6 + (4)-- > 10 + (5)-- > 15 (x)
//(2)2 5 9 14 2 + (3)-- > 5 + (4)-- > 9 + (5)-- > 14
//(3)4 8 13 4 + (4)-- > 8 + (5)-- > 13
//(4)7 12 7 + (5)-- > 12
//(5)11 11
//1 + (1)-- > 2 + (2)-- > 4 + (3)-- > 7 + (4)-- > 11 (y)
//输入行数N,num = 1,x = 2, y = 1, 作为初始值;num表示每行第一个数;
//按照上面规律递归处理每一行,求num输出;N == 0为结束条件;
void output(int n, int mun, int x, int y); //函数声明
int main(){
int n; scanf_s("%d", &n);
if ( n!= EOF){//EOF表示文件结尾
output(n, 1, 2, 0);
}
return 0;
}
/*----------------------------------------------*/
void output(int n, int num, int x, int y){
if (n == 0) return;
int num1 = num, x1 = x;
for (int i = 1; i < n; i++){
printf("%d ", num);
num += x;
x++;
}
printf("%d\n", num);
//修改初始值
n--; y++; num1 += y; x1++;
//递归调用
output(n, num1, x1, y);
return;
}
9.字符逆序输出
#include <stdio.h>
#include <string.h>
/**
题目描述:将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。
输入:输入包括一行。 第一行输入的字符串。
输出:输出转换好的逆序字符串。
样例输入:I am a student
样例输出:tneduts a ma I
* */
int main(void) {
char strinput[100] = { 0 }; //为了消除没有零终止符的警告 定义完之后直接赋值个0
scanf_s("%[^\n]", strinput, 100); //除了换行符以外的字符全部接收
char stroutput[100];
int i = 0, j = 0;
int len = strlen(strinput);//可能会出现 可能没有为字符串"XXX"添加字符串零终止符 的警告
//逆序拷贝
for (i = len - 1; i >= 0; i--) {
stroutput[j++] = strinput[i];
}
stroutput[j] = 0; //或 '\0'
printf("%s\n", stroutput);
return 0;
}
10.猜谜语,扣金币
#include <stdio.h>
/**题目 小明很喜欢猜谜语。 最近,他被邀请参加了X星球的猜谜活动。
每位选手开始的时候都被发给777个电子币。
规则是:猜对了,手里的电子币数目翻倍,
猜错了,扣除555个电子币, 扣完为止。
小明一共猜了15条谜语。
战果为:vxvxvxvxvxvxvvx
其中v表示猜对了,x表示猜错了。
请你计算一下,小明最后手里的电子币数目是多少。
请填写表示最后电子币数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路 直接计算器算都可以算出来,所以就不过多的说啥了。
答案 58497*/
int main(){
int x = 777;
int b[15] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0 };
for (int i = 0; i < 15; i++) {
if (b[i] == 1) {
x *= 2;
}
else {
x -= 555;
}
}
printf("%d\n",x);
return 0;
}
11.公鸡5元1只,母鸡3元1只,小鸡1元3只, 100元要买100只鸡,且必须包含公鸡、母鸡、 小鸡。编写程序,输出所有可能的方案。
/*
公鸡5元1只,母鸡3元1只,小鸡1元3只,
100元要买100只鸡,且必须包含公鸡、母鸡、
小鸡。编写程序,输出所有可能的方案。
*/
#include <stdio.h>
void main() {
int a, b, c;
printf("%6s%6s%6s\n", "公鸡", "母鸡", "小鸡");
for (a = 0; a <= 20; a++) {//公鸡最多能买20只
for (b = 0; b <= 33; b++) {//母鸡最多能买33只
for (c = 0; c <= 300; c += 3) {//小鸡最多能买300只
//公鸡+母鸡+小鸡共100只且公鸡价格+母鸡价格+小鸡价格共100元
if (a + b + c == 100 && 5 * a + 3 * b + c / 3 == 100) {
printf("%6d%6d%6d\n", a, b, c);//满足条件则输出
}
}
}
}
}
12.编写程序,在一个二维数组a中选出各行最大的元素组成一个一维数组b
/*
编写程序,在一个二维数组a中选出各行最大的元素组成一个一维数组b
*/
#include<stdio.h>
int main() {
int a[][4] = { {10,16,87,65} ,{14,32,11,108} ,{10,25,12,37} };
int b[3], max; //三个大数组所以有三个最大的
for (int i = 0; i < 3;i++) {
max = a[i][0];//每一行的第一个
for (int j = 0; j < 4;j++) {
if (a[i][j]>max) {
max = a[i][j]; //找出每个大数组中最大的
}
}
b[i] = max;//将找出的每个数组中最大的赋值给b数组的每个空间
}
//遍历数组中的元素
for (int i = 0; i < 3;i++) {
for (int j = 0; j < 4;j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
//遍历找到的最大的元素数组
for (int i = 0; i < 3;i++) {
printf("%d ",b[i]);
}
printf("\n");
return 0;
}
13.耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒, 请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号 :1,2,3,1,2,3…。凡是报到“3”就退出圈子, 最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。
#include <stdio.h>
/**约瑟夫环
耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,
请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号
:1,2,3,1,2,3...。凡是报到“3”就退出圈子,
最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。
* */
int main() {
int a[13] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 };
int number = 13;//记录当前人数
int count = 0;//1,2,3报数
int i = 0;
while (number > 1) {
if (a[i] != 0) { //如果有人就报数
count++;
}
if (count == 3) { //报到3
a[i] = 0;//剔除的人
count = 0;
number--;
}
i++;
if (i == 13) {
i = 0;
}
}
for (i = 0; i < 13; i++) {
if (a[i] > 0) {
printf("%d ", a[i]);
}
}
return 0;
}
14.c语言编写程序:输入三角形的三条边, 判断它们能否构成三角形, 若能则指出何种三角形.
/**
c语言编写程序:输入三角形的三条边,
判断它们能否构成三角形,
若能则指出何种三角形.
* */
#include<stdio.h>
#include<math.h>
int main(){
double a, b, c;
printf("请输入a b c的值每个数字空格隔开:\n");
scanf_s("%lf %lf %lf", &a, &b, &c);
if (a + b > c && b + c > a && c + a > b) {
if (a == b && a == c && b == c) {
printf("等边三角形\n");
} else if (a == b || a == c || b == c){
printf("等腰三角形\n");
} else if ((a * a + b * b == c * c) || (a * a + c * c == b * b) || (b * b + c * c == a * a)) {
printf("直角三角形\n");
}
} else {
printf("不能构成三角形\n");
}
return 0;
}
15.有一个数学等式:ab*cd=ba*dc,式中的一个字母代表一位数字, 编写程序,找出所有符合上述要求的乘积式并打印输出
#include <stdio.h>
int main(){
int a, b, c, d;
for (a = 0; a <= 9; a++) {
for (b = 0; b <= 9; b++) {
for (c = 0; c <= 9; c++) {
for (d = 0; d <= 9; d++) {
if ((a * 10 + b) * (c * 10 + d) == (10 * b + a) * (10 * d + c)) {
if ((a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d)) {
printf("%d%d*%d%d=%d%d*%d%d\n", a, b, c, d, b, a, d, c);
}
}
}
}
}
}
return 0;
}
16.一个偶数总能表示为两个素数之和,请输入任意一个偶数,并把它表 示为两个素数的和,例如输入偶数18,则只要输出18=5+13可, 18=7+11可以不计算
#include<stdio.h>
#include<math.h> //用到开方函数
//该函数判断m是否为素数,如果是则返回1,
int prime(int m){
if (m < 2) {
return 0;
}//若 a 不可被 2 ~ \sqrt{a}之间的数整除,那么a肯定是质数
for (int i = 2; i <= sqrt(m); i++) {
if (m % i == 0) { //判断是否可以整除
return 0; //可以整除则不是素数
}
}
return 1;
}
int main(){
int n,i;
printf("请输入一个偶数:");
scanf_s("%d", &n);
for (i = 2; i <= n/2; i++) {//取到 n/2 结束,防止重复
if (prime(i) && prime(n - i)) {//如果都为素数
break; //程序结束
}
}
printf("%d=%d+%d", n, i, n - i);//输出结果
return 0;
}
17.输入N个元素的整数数组,然后将其前面各元素按照顺序向后移 m个位置,最后m个数变成最前面的m个数
#include<stdio.h>
#define N 5
int main() {
int a[N], b[N], m;
printf("请输入m的值:\n");
scanf_s("%d",&m);
//1 2 3 4 5
for (int i = 0; i < N; i++) {
printf("请输入第%d个元素:\n",i+1);
scanf_s("%d", &a[i]);
}//m=2
for (int i = 0; i < m; i++) {//4 5
b[i] = a[N - m + i];//将要移动的最后元素保存在数组b中
}
for (int i = N - 1; i >= m; i--) {//1 2 3 4 5 -> 1 2 1 2 3
a[i] = a[i - m];//拿到其他元素从后往前一次赋值
}
for (int i = 0; i < m; i++) {//1 2 1 2 3 -> 4 5 1 2 3
a[i] = b[i];//将保存在数组b中的元素依次赋值到a数组中的前面位置
}
printf("移动后的数组:\n");
for (int i = 0; i < N; i++) {
printf("%-3d", a[i]);
}
return 0;
}
18.运输公司对用户计算运输费用,距离(s)越长,每公里运费越低。
每公里每吨货物的基本运费3元,距离不同标准不同,标准如下:
S<250公里 标准运价的100% 没有折扣
250<=s<500 公里 标准运价的98% 2%折扣
500<=s<1000 公里 标准运价的95% 5%折扣
1000<=s<2000 公里 标准运价的92% 8%折扣
2000<=s<3000 公里 标准运价的90% 10%折扣
3000<=s 公里 标准运价的85% 15%折扣
编写程序根据距离和货物重量计算运费
#include <stdio.h>
int main(){
float w, sum, z;
int x, s;
printf("请输入重量:");
scanf_s("%f", &w);
printf("请输入距离:");
scanf_s("%d", &s);
if (s >= 3000)
x = 12;
else
x = s / 250;
switch (x) {
case 0: z = 0; break; //代表250km以下,折扣z = 0
case 1: z = 2; break; //代表250~500km以下,折扣z=2%
case 2: break;
case 3: z = 5; break; //代表500~1000km,折扣z=5%
case 4: break;
case 5: break;
case 6: break;
case 7: z = 8; break; //代表1000~2000km,折扣z=8%
case 8: break;
case 9: break;
case 10: break;
case 11: z = 10; break; //代表2000~3000km,折扣z=10%
case 12: z = 15; break; //代表3000km以上,折扣z=15%
default:printf("输入数据错误!\n"); break;
}
sum = 3 * w * s * (1 - z / 100);
printf("总运费是:%f\n", sum);
return 0;
}
18.编写程序,已知一个整数数列A中的每个项为其前3个项之和, 请输入数列前3项的值,求此数列的前30项,要求:前3项的值由键盘 输入,如输入1,2,3则数列为1 2 3 6 11 20 37 …
#include<stdio.h>
int main() {
int arr[31];
for (int i = 0; i < 3;i++) {
printf("请输入第%d项:",i+1);
scanf_s("%d",&arr[i]);
}
for (int i = 3; i < 30; i++) {
arr[i] = arr[i - 1] + arr[i - 2] + arr[i - 3];
}
for (int i = 0; i < 30; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
19.一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,求这个三位数。
#include<stdio.h>
int main(){
int i, j, k;
//ijk和kji正好相反 所以i和k都不可能为0所以下面从1开始
//7进制最大到6 因为7要进1所以小于7 最大只能为6
for (i = 1; i < 7; i++) {
for (j = 0; j < 7; j++) {
for (k = 1; k < 7; k++) {
//找出7进制转换为10进制=9进制转换为十进制的结果
if (i + j * 7 + k * 7 * 7 == i * 9 * 9 + j * 9 + k){
printf("这个奇异的三位数是(括号内是进制):\n");
printf("%d%d%d(7)=%d%d%d(9)=%d(10)\n", k, j, i, i, j, k, i * 9 * 9 + j * 9 + k);
}
}
}
}
return 0;
}
20.有一个长度为n的整数数组,找出其中出现次数最多的数m
#include <stdio.h>
void repeated_most(int arr[], int n);
int main()
{
int n;
printf("请输入数组长度:");
scanf_s("%d", &n);
int num[100];
for (int i = 0; i < n; i++) {
printf("为数组第%d个空间赋值:",i+1);
scanf_s("%d", &num[i]);
}
repeated_most(num, n);
return 0;
}
//查找数组中出现次数最多的数
void repeated_most(int arr[], int n)
{
int m = arr[0]; //假设第一个值是最大的
int times = 1; //假设出现最多的次数是1
for (int i = 0; i < n; i++){ //循环拿到每一个数字
int temp = 1; //初始化出现的次数为1
for (int j = 0; j < n; j++){//再次循环拿到每一个数字
if (arr[j] == arr[i] && j != i) { //判断如果有相同的排出自身
temp++; //出现次数+1
}
}
if (temp > times){ //判断如果出现次数大于初识的次数
times = temp; //就将多的次数赋值给times最后结果就是最多的数
m = arr[i]; //将最多的那个值赋值给m
}
}
printf("%d %d\n", m, times);//输出值和他出现的次数
}
21.有一个 4*4的矩阵,求出该矩阵的两条对角线元素的和
# include <stdio.h>
int main(){
int a[4][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
int i, j, sum1=0, sum2=0;//定义sum1,sum2,分别存放两条对线元素的和;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
printf("%-5d", a[i][j]);// 输出该数组矩阵;
printf("\n");
}
printf("\n第一条对角线的元素值分别为:\n");
for (i = 0; i < 4; i++) {
printf("a[%d][%d]=%-3d", i, i, a[i][i]);//打印第一条对角线的元素及其值;
sum1 += a[i][i]; //求出第一条对角线的元素和;
}
printf("\n其元素的和值为:%d\n", sum1);
printf("\n第二条对角线的元素值分别为:\n");
j = 3;//第二条对角线元素为a[0][3]、a[1][2]、a[2][1]、a[3][0],用j的值约束列的值;
for (i = 0; i < 4; i++){
printf("a[%d][%d]=%-3d", i, i + j, a[i][i + j]);//打印第二条对角线的元素及其值;
sum2 += a[i][i + j]; //求出第二条对角线的元素和;
j -= 2; //第二条对角线元素列的值每次-1,但是行的值每次+1,所以j的值每次-2;
}
printf("\n其元素的和值为:%d\n", sum2);
printf("\n两条对角线元素的和值为:%d\n", sum1 + sum2);
return 0;
}
22编写计算多项式的值,输入N的值输出最终结果
/*
1 1 1
S = 1+--- + ----- + ... + -----------
1+2 1+2+3 1+2+3+...50
编写程序计算并输出多项式的值
*/
#include<stdio.h>
int main() {
int i, t = 0,n;
double sum = 0.0;
printf("请输入N的值:");
scanf_s("%d",&n);
for (i = 1; i <= n;i++){
t += i;
sum += 1.0 / t;
}
printf("%lf", sum);
return 0;
}
23,输入n(0<n<10),打印杨辉三角形,例如当n=6时输出:
#include<stdio.h>
void print()//按行数打印杨辉三角
{
int rows, coef = 1;//定义行数,值
printf("行数: ");
scanf_s("%d", &rows);
//控制行数
for (int i = 0; i < rows; i++)
{
//打印空格
/*for (int i = 1; i <= rows - i; i++)
printf(" ");*/
//
for (int j = 0; j <= i; j++)//第n行的数字有n项,所以j<=i
{
//第一行为1,第一列为1
if (j == 0 || i == 0)
coef = 1;
else
coef = coef * (i - j + 1) / j;//最后一个每一行i=j,倒数第二行(coef=j)等于列数,
printf("%4d", coef);
}
printf("\n");
}
}
int main()
{
print();
return 0;
}
24.一个楼梯有20阶台阶,每次只能上1级或2级,走完这20级台阶共有多少种走法?
#include <stdio.h>
/*
N = 1的时候只有一种方法。
N = 2的时候有两种方法。
N = K的时候,可以先走到k-1那里,然后向前走一阶,或者先走到k-2那里然后前走两阶
所以后一个答案是前两个的答案之和
*/
int fun(int n) {
if (n <= 0)
return 0;
if (n == 1)
return 1;
if (n == 2)
return 2;
return fun(n - 1) + fun(n - 2); //如3层楼梯 就是2层和1层楼梯走法之和
}
int main()
{
int N;
printf("请输入楼梯层数:");
scanf_s("%d", &N);
printf("上楼方法共:%d种\n", fun(N));
return 0;
}
25.输入一个十进制整数num,将其转换成temp(2~9)进制后输出
#include <stdio.h>
#define MAX_SIZE 100
int main(){
int arr[MAX_SIZE]; //存放结果的数组
int index=0; //下标
int num; //十进制数
int temp; //转换的进制
printf("请输入十进制数:");
scanf_s("%d", &num);
printf("请输入待转换的进制:");
scanf_s("%d", &temp);
do{//进制转换 取模运算 得到余数 存入数组
arr[index++] = num % temp;
num /= temp;
} while (num);
//从后往前遍历数组中有值的空间
for (int i = index-1; i >= 0;i--) {
printf("%d", arr[i]);
}
printf("\n");
return 0;
}
26.在文本文件A中存储了如下10个整数:2 1 3 5 4 8 7 6 10 9
编写程序,找出其中的最大值,最小值,并计算平均值存储在文本文件
B中,B中格式如下:
最小值:1
最大值:10
平均值:5.5
#include<stdio.h>
int main() {
int arr[10];//定义用来存放文件中读取到的数字的数组
FILE* fp; //定义文件指针变量
fp = fopen("d:\\demo1.txt", "rt"); //以只读的方式打开C:\\student.txt
for (int i = 0; i < 10;i++) {
fscanf_s(fp, "%d", &arr[i]); //从文件中读取
}
//读取到文件后找到最大值最小值平均值
int max = arr[0], min = arr[0];
double avg = 0, sum = 0;
for (int i = 0; i < 10;i++) {
if (max<arr[i]) {
max = arr[i];
}
if (min>arr[i]) {
min = arr[i];
}
sum += arr[i];
}
avg = sum/10;
fp = fopen("d:\\demo2.txt", "wt"); //以只写的方式打开文件
//写入信息
fprintf(fp, "最小值:%d\n",min);
fprintf(fp, "最大值:%d\n", max);
fprintf(fp, "平均值:%lf\n", avg);
fclose(fp); //关闭fp所指向的文件
printf("成功!\n");
return 0;
}
27.输出等腰三角形
#include <stdio.h>
int main(){
int n;
printf("请输入层数:");
scanf_s("%d", &n);
//共输出n行 n=5
for (int i = 1; i <= n; i++){ //打印的空格数为n-1
//每行空格数为4 3 2 1 0
for (int j = 1; j <= n - i; j++) {
printf(" ");
}
//i = 1 2 3 4 5
//k = 1 3 5 7 9
//k = 2*i-1
for (int k = 1; k <= 2 * i-1; k++) {
printf("*");
}
printf("\n");
}
return 0;
}
28.输入n(正整数)确定一个N*N的矩阵,将矩阵的每一行按照从小到大顺序排序
#include<stdio.h>
int main() {
int n, a[100][100];
//输入n的值 确定为几乘几的矩阵
printf("请输入n确定为几乘几的矩阵:");
scanf_s("%d", &n);
//循环输入为数组赋值
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("输入矩阵中的值:");
scanf_s("%d", &a[i][j]);
}
}
//输出矩阵
for (int i = 0; i < n;i++) {
for (int j = 0; j < n;j++) {
printf("%4d",a[i][j]);
}
printf("\n");
}
//每行按照冒泡排序从小到大排序
for (int i = 0; i < n; i++) { //控制行
//对每行进行冒泡排序
for (int j = 0; j < n - 1; j++) { //控制趟数
for (int k = 0; k < n - j - 1;k++) { //控制次数
if (a[i][k]>a[i][k+1]) { //比较看是否交换位置
int n = a[i][k];
a[i][k] = a[i][k + 1];
a[i][k + 1] = n;
}
}
}
}
//排序后输出
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}
29.编写程序,在一个文件a.txt中读取每行数字找到每行最大的元素写入到b.txt中
A.txt中的内容为: B.txt写入内容为:
12 16 87 65 87 96 37 46
15 32 13 96
10 25 14 37
11 33 23 46
#include<stdio.h>
int main() {
int arr[4][4];//存储读到的每一行数据
FILE* fp; //定义文件指针变量
int max; //定义最大值
int marr[4];//存储每一行最大的
int index = 0;//存储索引值
fp = fopen("d:\\A.txt", "rt"); //以只读的方式打开C:\\student.txt
for (int i = 0; i < 4; i++) {
max = arr[i][0]; //假设每一行的第一个最大
for (int j = 0; j < 4;j++) {
fscanf_s(fp, "%d", &arr[i][j]); //从文件中读取
printf("%d ",arr[i][j]); //遍历输出读取到的每一行数据
if (max<arr[i][j]) {
max = arr[i][j]; //比较找出最大的
}
}
marr[index] = max;//将最大的赋值给marr数组
index ++; //索引值++
printf("\n"); //每输出一行加一个换行
}
fp = fopen("d:\\B.txt", "wt"); //wt创建文件写入
for (int i = 0; i < 4;i++) {
fprintf(fp, "%d ", marr[i]);
}
fclose(fp); //关闭fp所指向的文件
printf("成功!\n");
return 0;
}
30.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。
/*
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,
发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。
令:X10=1,根据题意容易得出
X9=2*(X10+1)
X8=2*(X9+1)
…
Xn=2*(Xn+1+1)
*/
#include<stdio.h>
//返回第n天时的桃子数
int func(int n){
if (n == 10)
return 1;
else
return 2 * (func(n + 1) + 1); //当天的桃子数=下一天的桃子数*2+1
}
int main(){
for (int i = 1; i <= 10; i++) {
printf("第%d天的桃子数:%d\n", i, func(i));
}
return 0;
}
31.一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。
#include <stdio.h>
void move(int, char, char, char);
int num = 1;//记录次数
int main(){
int n;
printf("请输入圆环数:");
scanf_s("%d", &n);
move(n, 'A', 'B', 'C');
return 0;
}
/*
步骤1:将A柱子上 P_{1}.........P_{n-1}以某种方法全部放到B柱子上(此时A柱子只有 P_{n},middle柱子上有 P_{1}........P_{n-1},而C(end)柱子上没有盘子)
步骤2:将柱子上仅存的 P_{n}挪到空无一物的C柱子上。
步骤3:将B柱子上剩余的 P_{1}......P_{n-1}全部挪到C柱子上。
*/
//从A到C那B是缓冲区
void move(int n, char a, char b, char c){
if (n == 1) {
printf("第%d步:%c-->%c\n", num, a, c);
num++;
} else {
move(n - 1, a, c, b);//从A到B那C是缓冲区
printf("第%d步:%c-->%c\n", num, a, c);
num++;
move(n - 1, b, a, c);//从B到C那A是缓冲区
}
}