编程题 - 递归问题

Ackermann函数ack(m,n)采用以下递归式定义:
ack(0,n)=n+1
ack(m,0)=ack(m-1,1)
ack(m,n)=ack(m-1,ack(m,n-1))
其中,m>0,n>0
编写一个计算此函数的递归函数。
测试用例:
如输入:
1,1
则输出:
3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int ack(int m,int n)
{
//int r;
if(m==0)
{
return n+1;
}
if(n==0)
{
return ack(m-1,1);
}
if(n>0 && m>0)
{
return ack(m-1,ack(m,n-1));
}
//printf("%d",r);
}
int main(void)
{
int m,n;
scanf("%d,%d",&m,&n);
printf("%d",ack(m,n));
}

编程题 - 公式求解

编写函数,用牛顿迭代法求方程f(x)=2x3-4x2+3x-6=0在1.5附近的根。
牛顿迭代公式为:xn+1=xn-f(xn)/f’(xn)
其中,f’(xn) 是f在xn处的导数。
结束条件:|f(xn+1)|< eps与|xn+1-xn|< eps同时成立(eps是一个很小的正数,从键盘输入)
同时编写主函数,在主函数中调用并输出函数值。
函数原型如下:
double root(double (*f)(double),double (*f1)(double),double x,double eps);
其中,形参f接收原函数f(x),形参f1接收导函数f’(x)
如输入:
1e-8
如输出结果为:
2.000000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#include<math.h>
double f2(double x);
double f3(double x);
double root(double(*f2)(double), double(*f3)(double), double x, double eps);
int main()
{
double x = 1.5, eps, b;
scanf("%lf", &eps);
b = root(f2, f3, x, eps);
printf("%lf", b);
return 0;
}
double root(double(*f2)(double), double(*f3)(double), double x, double eps)
{
double x1, a = 0;
do
{
x1 = x - f2(x) / f3(x);
a = x - x1;
x = x1;
} while ((fabs(f2(x1)) > eps) || (fabs(a) > eps));
return x1;
}
double f2(double x)
{
return 2 * x*x*x - 4 * x*x + 3 * x - 6;
}
double f3(double x)
{
return 6 * x*x - 8 * x + 3;
}

编程题 - 逆序函数

编写函数,函数原型如下:
void fun(int n,char res[]);
函数功能是将整数n的各位数字逆序排列,存放到res字符数组中。
例如整数1035,逆序后为5301
程序测试举例,如输入:
9680200
则输出:
0020869

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
void fun(int n)
{
char res[9]={0};
int i=0,j=0;
while (i>=0 && n>=10)
{
res[i]=n%10;
n=n/10;
i++;
}
res[i]=n;
while (j<=i)
{
printf("%d",res[j]);
j++;
}

编程题 - 字符统计

输入一个字符串(其长度不超过81),分别统计其中26个英文字母出现的次数(不区分大、小写字母),并按字母出现次数从高到低排序,若次数相同,按字母顺序排列。字母输出格式举例,例如:A-3,表示字母A出现3次,C-0表示字母C没有出现。
输入:
第一行为输入,占一行,输入的字符串可能含有空格
输出:
第二行为输出,占一行。按照字母输出格式从高到低输出,各字母输出之间用一个空格字符分隔。
样例:
123abcAABXxwvUu+
A-3 B-2 U-2 X-2 C-1 V-1 W-1 D-0 E-0 F-0 G-0 H-0 I-0 J-0 K-0 L-0 M-0 N-0 O-0 P-0 Q-0 R-0 S-0 T-0 Y-0 Z-0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<stdio.h>
#include<string.h>
void fun(char ss[]);
int main()
{
char ss[81];
gets(ss);
fun(ss);
}
void fun(char ss[])
{
int len = strlen(ss);
ss = strupr(ss);
char zimu[26];
for (int i = 0; i < 26; i++)
{
zimu[i] = 'A' + i;
}
int cishu[26];
for (int i = 0; i < 26; i++)
cishu[i] = 0;
for (int i = 0; i < 26; i++)
{
for (int j = 0; j < len; j++)
{
if (ss[j] == zimu[i])
cishu[i]++;
}
} //统计字母
int sx[26];
int copy[26];
for (int i = 0; i < 26; i++)
{
copy[i] = cishu[i];
}
for (int i = 0; i < 26; i++)
{
int x = -1;
for (int j = 0; j < 26; j++)
{
if (copy[j] > x)
{
x = copy[j];
sx[i] = j;
}
}
copy[sx[i]] = -1;
}
printf("%c-%d", zimu[sx[0]], cishu[sx[0]]);
for (int i = 1; i < 26; i++)
{
printf(" %c-%d", zimu[sx[i]], cishu[sx[i]]);
}
}

编程题 - 按规则倒序输出子字符串

编写程序,按下列规则倒序输出子字符串。先输出最后的一个字符,再输出最后两个字符串,再输出后面三个字符…, 最后输出整个字符串。输入的字符串长度不超过100。
输入:一个字符串
输出:空格隔开的子字符串,用一个空格间隔。
输入输出样例如下所示:
输入:Hello
输出:o lo llo ello Hello

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<string.h>
void fun(char ss[]);
int main()
{
char ss[100];
gets(ss);
fun(ss);
}
void fun(char ss[])
{
int len = strlen(ss);
ss = strrev(ss);
printf("%c", ss[0]);
for (int i = 1; i < len; i++)
{
printf(" ");
for (int j = i; j >= 0; j--)
{
printf("%c", ss[j]);
}
}
}

编程题 - 排序

有一个包含奇数个项的整数序列,请编程按照以下规则排序:最大值排在中间,最小值排在最左,中值排在最右,其它值清为0。输入2行,第一行n表示要输入的数的个数,n是奇数。第二行输入的n个数。输出,排序后的数组,数据空格分隔,最后一个数据后面没有空格。
样例:
5
12 20 9 88 32
9 0 88 0 20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>
void no(int n)
{
int ni=1,no0;
no0=(n-1)/2;
while(ni<no0)
{
printf("0 ");
ni++;
}
}
int main()
{
int i,j,t,a[21]={0};
int n,no0,m,ni=1;
scanf("%d",&n);
//no0=(n-1)/2;
m=(n+1)/2;
//printf("Line1\n");
for(i=0;i<n;i++) scanf("%d",&a[i]);
//printf("\n");
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
if (a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
//printf("below:\n");
//for(i=0;i<5;i++)
// printf("%d ",a[i]);
printf("%d ",a[0]);
no(n);
printf("%d ",a[n-1]);
no(n);
printf("%d",a[m-1]);
}

编程题 - 排序后插入新的数

输入数组a( 长度为n, n<10),对元素按由小到大顺序排列,然后再输入一个数b插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列。
输入(第一行数组大小n,第二行为输入的数组,第三行为插入的整数):
5
5 2 3 4 8
7
输出:
2 3 4 5 7 8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
int main()
{
int i,j,t,a[10]={0};
int in;
scanf("%d",&in);
int n=in;
for(i=0;i<n;i++) scanf("%d",&a[i]); //input
scanf("%d",&a[n]);
//printf("%d",a[n]);
for(j=0;j<n;j++)
for(i=0;i<n-j;i++)
if (a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
} //now min=a0 max=an-1
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("%d",a[n]);
//printf("\n");
//for(i=n-1;i>0;i--)
//printf("%d ",a[i]);
//printf("%d",a[0]);
}

编程题 - 求最大公约数和最小公倍数

输入两个正整数,输出其中最大公约数和最小公倍数。

  1. 求p和q的最大公约数的欧几里德算法:
    (1)输入p和q(p>q)
    (2)计算p和q的余数r
    (3)r=0时,q即为最大公约数,转第(4)步,否则,令p=q,q=r,继续执行第(2)步
    (4)输出q
  2. p和q的最小公倍数为p乘以q再除以它们的最大公约数。
    如输入:
    15,25
    则输出:
    最大公约数是5
    最小公倍数是75
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main()
{
int a,b,p,q,r,d,t;
scanf("%d,%d",&a,&b);
p=a;
q=b;
if (p<q)
{
t=q;
q=p;
p=t;
} //now p>q
//printf("%d\n",p);
//printf("%d\n",q);
while(q>0)
{
r=p%q;
p=q;
q=r;
}
d=(a*b)/p;
printf("最大公约数是%d\n",p);
printf("最小公倍数是%d",d);
}

编程题 - 字符串中查找字符位置

输入待查找的字符串:I am a student
输入所需查找的字符:m
在字符串I am a student中找到字符m,如有多个m,查找第一个。其位置在4。
测试样例如下:(输入时待查找的字符串与所需查找的字符用*号隔开)
输入:
I am a student*m
输出:
4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
char a[]={0};
int indexof(char letter)
{
int i = 0;
while (a[i] != '\0') {
if (a[i] == letter)
return i;
i++;
}
return -1;
}
int main(void)
{
gets(a);
int l,le;
l=strlen(a);
le=a[l-1];
//printf("%c\n",le);
printf("%d", indexof(le)+1);
return 0;
}

编程题 - 分数序列求和

有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, …. 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。 输入:整数,项数输出:实数,和
样例:
6
10.0071

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
void main()
{
double f[32]={0};
double a[32]={0},b[32]={0};
int n,i=1,j=0;
float s=0;
a[0]=2;
b[0]=1;
f[0]=2;
while (i<32)
{
b[i]=a[i-1];
a[i]=a[i-1]+b[i-1];
f[i]=a[i]/b[i];
i++;
}
//printf("%f\n",a[5]);
//printf("%f\n",b[5]);
//printf("%f\n",f[5]);
scanf("%d",&n);
while (j<n)
{
s=s+f[j];
j++;
}
printf("%.4f",s);
}