编程41-50

文章涵盖了C语言编程中的多个技术主题,包括数组的循环移动、计算ack函数值、求最大公约数、多项式求值、数字字母替换、查找相同元素、等值数列段、反弹高度模拟以及电梯运行时间的计算,还涉及了对数的反向处理。
摘要由CSDN通过智能技术生成

41.输出循环移动的数列

设数组 A 中存有 n n>0 )个整数, 在不允许使用另外数组的前提下 ,将 A 中的每个整数循环右移
m m>=0 )个位置。即:将 A 中的数据由( A0A1……An-1 )变换为( An-m…… An-1A0A1……
An-m-1 )。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[100];
	int n, m;
	scanf("%d %d\n", &n, &m);
	for (int i = 0; i < n; i++) {
		scanf("%d", a + i);
	}
	printf("%d", a[n - m]);
	for (int i = 1; i < n; i++) {
		printf(" %d", a[(i + n - m) % n]);
	}
	return 0;
}

42.计算函数ack(m,n)的值

编程计算函数 ack(m,n) 的值。 m,n 的定义域是非负整数 (m<=3 n<=9)
m=0 时, ack(0,n)=n+1
n=0 时, ack(m,0)=ack(m-1,1)
其它情况下, ack(m,n)=ack(m-1,ack(m,n-1) )
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int ack(int m, int n) {
	if (m == 0) {
		return n + 1;
	}
	else if (n == 0) {
		return ack(m - 1, 1);
	}
	else {
		return ack(m - 1, ack(m, n - 1));
	}
}
int main() {
	int m, n;
	scanf("%d%d", &m, &n);
	printf("%d", ack(m, n));
	return 0;
}

43.求最大公约数

n 个数的最大公约数。其中: 2< = n<50
输入格式 n个正整数,用空格隔开。以 0 作为输入的结束标志。
输出格式: 分两行显示 。分别显示最大公约数和这 n 个数, n 个数用 1 个空格隔开(第一个数前及最后一个数 之后无空格)。

小知识

辗转相除法求最大公约数(利用嵌套函数):
int gcd(int a, int b){
 return b ? gcd(b, a % b) : a ;
}

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int gcd(int a, int b) {//辗转相除法求最大公约数
	if (b >= a) {
		int t = a;
		a = b;
		b = t;
	}
	int t = 1;;
	while (t != 0) {
		t = a % b;
		a = b;
		b = t;
	}
	return a;
}
/*
int gcd(int a, int b)
{
 return b ? gcd(b, a % b) : a ;
}
*/
int main() {
	int x[50];
	int g;
	int num = 0;
	scanf("%d", x);
	for (int i = 1; x[i - 1] != 0; i++) {
		scanf("%d", x + i);
		num++;
	}
	for (int i = 1; x[i] != 0; i++) {
		x[i] = gcd(x[i - 1], x[i]);
	}
	printf("%d\n", x[num - 1]);
	for (int i = 0; i < num; i++) {
		if (i == 0) {
			printf("%d", x[i]);
		}
		else {
			printf(" %d", x[i]);
		}
	}
	return 0;
}

44.求多项式的值

编写程序,计算下列多项式的值 :
poly(n,x)=1,  n=0
poly(n,x)=x,  n=1
poly(n,x)=((2 n-1) x poly(n-1,x)-(n-1)* poly(n-2,x))/n,  n>1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
double poly(int n, double x) {
	switch (n){
	case 0:return 1; break;
	case 1:return x; break;
	default:
		return ((2 * n - 1) * x * poly(n - 1, x) - (n - 1) * poly(n - 2, x)) / n;
		break;
	}
}
int main() {
	int n; double x;
	scanf("%d%lf", &n, &x);
	printf("%lf", poly(n, x));
	return 0;
}

45.将数字替换为字母

将数字替换为字母。输入一个整数,将它除以 2 ;再将除以 2 后所得数字的整数部分的各位用相应
序号的字母替代。替换原则: 0 换为 a 1 换为 b 2 换为 c ... ,以此类推, 9 换为 j
例如, 1234, 除以 2 等于 617 ,替换结果为 gbh
字符串全部空字符的初始化:
//char a[100] = {'/0'};
//char a[100] = { 0 };
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	int x;
	scanf("%d", &x);
	printf("%d ", x/2);
	char a[100] = {'/0'};//空字符以便后续反转
	int n = x / 2;
	for (int i = 0; n != 0; i++) {
		a[i] = 'a' + n % 10;
		n /= 10;
	}
	_strrev(a);
	printf("%s", a);

	return 0;
}

46.查找相同元素

定义最大下标为 50 的整型数组 a b ,编程实现:查找同时在数组 a 和数组 b 中的全部元素。
输入格式 : 首先输入数组a 的元素个数,再输入数组 a 每个元素的值;接着输入数组 b 的元素个数,再输入数 组b 中各元素的值。
输出格式 : 输出同时在两个数组的全部元素,各元素间用空格隔开(第 1 个元素前和最后 1 个元素后无空格。

方法一:布尔类型

布尔类型(_Bool)

**使用 _Bool 时,直接使用其定义变量。只能取值范围为0或1。将任意非零值赋值给_Bool类型,都会先转换为1,表示。将零值赋值给_Bool类型,结果为0,表示

**使用头文件 <stdbool.h> 时,通过bool来定义布尔变量,通过truefalse对布尔变量进行赋值

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
int main() {
	int a[50], b[50];
	int A, B;
	scanf("%d", &A);
	for (int i = 0; i < A; i++) {
		scanf("%d", a + i);
	}
	scanf("%d", &B);
	for (int i = 0; i < B; i++) {
		scanf("%d", b + i);
	}
	bool Bool[50] = {false};
	for (int i = 0; i < A; i++) {
		for (int j = 0; j < B; j++) {
			if (a[i] == b[j]) {
				Bool[j] = true;//关键点
				break;//只让离break最近的循环停止
			}
		}
	}
	int flag = 0;
	for (int i = 0; i < B; i++) {
		if (Bool[i]) {
			printf("%s%d", (flag++) ? " " : "", b[i]);
		}
	}
	return 0;
}

方法二

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int a[50], b[50];
	int A, B;
	scanf("%d", &A);
	for (int i = 0; i < A; i++) {
		scanf("%d", a + i);
	}
	scanf("%d", &B);
	for (int i = 0; i < B; i++) {
		scanf("%d", b + i);
	}
	//
	int flag = 1, count = 0;
	for (int i = 0; i < A; i++) {
		for (int j = 0; j < B; j++) {
			if (a[i] == b[j]) {
				flag = 1;
				for (int k = 0; k < i; k++) {
					if (a[i] == a[k]) {
						flag = 0;//不是新的
						break;
					}
				}
				if (flag) {
					printf("%s%d", (count++) ? " " : "", a[i]);
				}
			}
		}
	}
	return 0;
}

47.等值数列段

如果一个数列中某一段(至少有两个元素)的各元素值均相同,则称其为等值数列段。等值数列
段中元素的个数叫做等值数列段的长度。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Count(int a[], int i, int j) {
	int count = 0;
	while (a[i] == a[j]&&i<j) {
		count++;
		i++; j++;
	}
	return count;
}
int main() {
	int n, a[50];
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", a + i);
	}
	int max = 0, count = 0;
	int begin;
	for (int i = 0; i < n; i++) {
		count = 0;
		for (int j = i + 1; j < n; j++) {
			if (a[i] == a[j]&&j-i==count + 1) {
				count++;
			}
		}
		if (max < count) {
			max = count;
			begin = i;
		}
	}
	if (max) {
		printf("%d,%d", begin, begin + max);
	}
	else printf("NO");
	return 0;
}

48.第n次反弹的高度

一个球从 100 米高度自由落下,每次落地后反弹回原高度的 一半 ,再落下,再反弹。求其到第 n
落地( 不考虑第 n 次反弹 ),共经过了多少米?第 n 次反弹高度是多少米?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
	double height = 100, x = 0;
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++){
		x += height * 2;
		height /= 2;
	}
	printf("%lf\n%lf", x - 100, height);
	return 0;
}

49.电梯运行时间

某城市最高的楼有一部电梯,该电梯依照输入楼层数的先后次序运行。电梯最初在 0 层。运行完
一个输入序列后就停止在该楼层, 不返回 0 。编写程序计算电梯运行一个序列的时间。电梯每
1 层需要 6 秒。每下 1 层需要 4 秒。如在某层停留,无论上下人多少,均停留 5 秒。 楼层值大于等
1 小于 100  , 0 在序列中表示结束序列输入。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	int t = 0, floor[100] = { 0 };
	scanf("%d", &floor[1]);//
	for (int i = 1; floor[i] != 0; i++){//常用的输入方式
		int k = floor[i] - floor[i - 1];
		if (k > 0){
			t += k * 6;
		}
		else{
			t -= k * 4;
		}
		t += 5;
		scanf("%d", &floor[i + 1]);
	}
	printf("%d", t);
	return 0;
}

50.题目的正确答案

叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:小明会把 1234 它看成
4321 ;把 - 1234 看成 - 4321 ;把 230 看成 032 ( 032= 32) ;把 - 230 - 032( - 032= - 32) 。现在,
小明做了一些 a+b a-b 的题目 (a, b 为整数且不含前导 0) ,如果给你这些题目的正确答案,你能
猜出小明会得到什么答案吗?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int reversed(int x) {//将数反过来
	int k = 1;
	x < 0 ? k = -1, x = -x : 0;
	int revx = 0;
	for (; x != 0; x /= 10){
		revx = revx * 10 + x % 10;
	}
	return revx * k;
}
int main() {
	int x, y, a1, b1;
	scanf("%d %d", &x, &y);
	a1 = reversed((x + y) / 2);
	b1 = reversed((x - y) / 2);
	printf("%d %d", a1 + b1, a1 - b1);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值