我尝试使用递归在C中编写代码。
用户写入两个长度相同的正数,程序会给他一个新号码,其编号如下:
新数字统一数字=用户所写的第二个正数中的最小数字。
新的十位数=用户所写的第一个正数中的最大位数。
事实很简单,这是一个例子:
5642
和2371
会给我们:61
。
我试过这样的事情:
#include <stdio.h>
int calcPair(int a, int b){
int number = calcPair(a/10, b/10);
int digit1 = (number/10);
int digit2 = number%10;
if(digit1 < a%10){
digit1 = a%10;
}
if(digit2 > b%10){
digit2 = b%10;
}
return(number);
}
int main()
{
int a, b, number=0;
printf("Please enter two positive number of same length:\n");
scanf("%d", &a);
scanf("%d", &b);
calcPair(a, b);
printf("The two-digit number composed from %d, %d is: %d", a, b, number);
return 0;
}
但该程序根本没有运行..并关闭。
也许有人可以纠正我?或者帮助我找到错误。
先谢谢。
答案 0 :(得分:3)
你的递归永远不会结束。请考虑calcPair
中的以下行:
int number = calcPair(a/10, b/10);
除非您将其设置为有条件,否则将始终执行此语句,例如:
int number;
if((a != 0) || (b != 0))
number = calcPair(a/10, b/10);
最后,因为您将这两个数字除以10,这个条件将证明FALSE
。
答案 1 :(得分:1)
这样的事情:
int calcPair(int a, int b){
int number;
if (a < 10 && b < 10) {
number = a*10 + b;
} else {
int digita = a%10;
int digitb = b%10;
number = calcPair(a/10, b/10);
if(digita > number/10){
number = digita*10 + number%10;
}
if(digitb < number%10){
number = (number/10)*10 + digitb;
}
}
return number;
}
另外,主要的一个小修复:
int main()
{
int a, b, number=0;
printf("Please enter two positive number of same length:\n");
scanf("%d", &a);
scanf("%d", &b);
number = calcPair(a, b);
printf("The two-digit number composed from %d, %d is: %d", a, b, number);
return 0;
}
答案 2 :(得分:1)
您是否被允许 (您未在OP中指定),
这是一个递归搜索方法,使用 字符串 :
字符串 只是char
的数组。因为您有兴趣区分较大整数内的各个数字,char
数据类型将是一个足够大小的容器,以便于比较。
在递归函数中使用char
(字符串)数组,退出条件为strlen()
&gt; 0将允许您遍历每个整数,并选择适当的值(最小值或最大值)
此方法使用两个递归函数 :getMinDigit()
和getMaxDigit()
,两者都返回表示最大值数字的char或其各自的最小值数字原始的多位整数。然后将这些结果连接起来,并转换回两位数的整数。
以下是给出的示例代码 :
5642和2371
会给我们:61。
char getMinDigit(char *digit)
{
static char val='9';//largest single digit base 10
int len=0;
if(strlen(digit) > 0)
{
len = strlen(digit);
if(digit[len-1] < val) //test for smallest char in string
{
val = digit[len-1];
digit[len-1] = 0;
getMinDigit(digit);
}
else
{
digit[len-1] = 0;
getMinDigit(digit);
}
}
return val;
}
char getMaxDigit(char *digit)
{
static char val='0'; //smallest single digit base 10
int len=0;
if(strlen(digit) > 0)
{
len = strlen(digit);
if(digit[len-1] > val) //search for largest char in string
{
val = digit[len-1];
digit[len-1] = 0;
getMaxDigit(digit);
}
else
{
digit[len-1] = 0;
getMaxDigit(digit);
}
}
return val;
}
int calcPair(int a, int b)
{
char big[10]={""}, small[10]={""};
char Big, Small;
char result[3]={""};
sprintf(big, "%d", a);
sprintf(small, "%d", b);
Big = getMaxDigit(big); //recursive function
Small = getMinDigit(small); //recursive function
sprintf(result, "%c%c", Big, Small);
return atoi(result);
}
int main(void)
{
int result = calcPair(5642, 2371);
printf("%d", result);
return 0;
//for illustration, hard coded to OP values
//int a, b, number=0;
//printf("Please enter two positive number of same length:\n");
//scanf("%d", &a);
//scanf("%d", &b);
//calcPair(a, b);
//printf("The two-digit number composed from %d, %d is: %d", a, b, number);
//return 0;
}
答案 3 :(得分:1)
我认为您可以使用一些辅助函数来重构您的代码以更好地表达您的需求。
int greater(int a, int b)
{
return (a>b);
}
int less(int a, int b)
{
return (a<b);
}
int pickDigit(int n, int (*func)(int, int))
{
int ret = n%10;
n /= 10;
while ( n > 0 )
{
if ( fun(n%10, ret) )
{
ret = n%10;
}
n /= 10;
}
return ret;
}
int getBiggestDigit(int n)
{
return pickDigit(n, greater);
}
int gteSmallestDigit(int n)
{
return pickDigit(n, less);
}
int numDigits(int n)
{
int ret = 0;
while (n > 0 )
{
++ret;
n /= 10;
}
return ret;
}
int calcPair(int a, int b)
{
if ( numDigits(a) != numDigits(b) )
{
// Deal with error.
}
return betBiggestDigit(a)*10+getSmallestDigit(b);
}