1
递归求解最大字符串(10分)
问题描述:编写递归函数char* StrMax(char *StrArr[ ],int n),用递归方法求n个字符串中按ASCII字典顺序排序为最大的字符串。
输入:字符串个数n(最多不超过100个),n个字符串(每个字符串不超过99个字符)
输出:按ASCII字典排序最大的字符串
样例: 输入 5
BJilin
AJilin
HJilin
IJilin
IJilinU
输出 IJilinU
时间限制:500ms内存限制:32000kb
非递归
#include <stdio.h>
int str_cmp(char* str1, char* str2)
{
do {
if (*str1 > *str2)return 1;
else if (*str1 < *str2)return -1;
} while ((*(str1++) != '\0') && ( * (str2++) != '\0'));
return 0;
}
char* StrMax(char* StrArr[], int n)
{
char* temp;
int i, j, k;
for (int i = 0; i < n - 1; i++)
{
k = i;
for (int j = i + 1; j < n; j++)
if (str_cmp(StrArr[k], StrArr[j]) > 0)k = j;
temp = StrArr[i];
StrArr[i] = StrArr[k];
StrArr[k] = temp;
}
return StrArr[n-1];
}
int main() {
char str[100][100];
char* str_p[100];
int n, i = 0, temp; scanf("%d",&n); temp = n;
while (temp--) {
scanf("%s",str[temp]);
str_p[temp] = str[temp];
}
printf("%s",StrMax(str_p, n));
return 0;
}
12/7 update递归方法
#include <stdio.h>
int str_cmp(char* str1, char* str2)
{
int len1 = 0, len2 = 0;
char* temp1 = str1, * temp2 = str2;
while (*temp1 != '\0')
{
len1++;
temp1++;
}
while (*temp2 != '\0')
{
len2++;
temp2++;
}
if (len1 > len2)return 1;
else if (len1 < len2)return -1;
else {
do {
if (*str1 > *str2)return 1;
else if (*str1 < *str2)return -1;
} while ((*(str1++) != '\0') && (*(str2++) != '\0'));
return 0;
}
}
char* StrMax(char* StrArr[], int n)
{
if (n == 1)return *StrArr;
else {
if (str_cmp(*StrArr, StrMax(StrArr+1,n-1)) > 0)return *StrArr;
else return StrMax(StrArr + 1, n - 1);
}
}
int main() {
char str[100][100];
char* str_p[100];
int n, i = 0, temp; scanf("%d", &n); temp = n;
while (temp--) {
scanf("%s", str[temp]);
str_p[temp] = str[temp];
}
printf("%s", StrMax(str_p, n));
return 0;
}
细细品味字符指针数组的运用!同时修复了前文的小bug。
2
递归求解运算次数(10分)
问题描述:编写递归函数void JGFun(int InData,int *Nums)实现:输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过有限次运算后,可以得到自然数值1。求经过多少次可得到自然数1,并打印中间运算过程。InData为自然数,*Nums为运算次数,*Nums初值为0。
输入:任意一个大于0的整数
输出:依次输出中间运算过程中的数值,最后输出运算次数
样例3: 输入 3
输出 3(乘3加1)->10(除2)->5(乘3加1)->16(除2)->8(除2)->4(除2)->2(除2)->1
7
时间限制:500ms内存限制:32000kb
#include <stdio.h>
int c = 0;
void JGFun(int n,int *p) {
if (n == 1)return;
else if (n % 2 == 1) {
c++;
*p = n;
*(p + 1) = 1;
JGFun(3 * n + 1, p+2);
}
else {
c++;
*p = n;
*(p + 1) = 0;
JGFun(n / 2, p + 2);
}
}
int main() {
int n,ans[100];
scanf("%d",&n);
JGFun(n, ans);
for (int i = 0; i < c * 2; i++)
{
if (ans[i] == 1)printf("(乘3加1)->");
else if(ans[i] == 0)printf("(除2)->");
else printf("%d", ans[i]);
}
printf("1\n%d", c);
return 0;
}