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来定义布尔变量,通过true和false对布尔变量进行赋值
#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;
}