C 重新排列数字块

C 重新排列数字块,c,recursion,math,C,Recursion,Math,我遇到了一个我不知道答案的难题:“用递归函数将整数中的数字重新排列为两个一组”下面是一个例子: 输入:123456 幸运的是,有一种情况可以让它变得更简单,输入位数总是偶数 现在我做了一段时间的实验,但除了使用printf的无效解决方案外,我无法想出一个有效的解决方案 有没有人能给我一些灵感或想法来解决这个问题?下面的程序应该可以 #包括 无效重新排列(整数n,整数*输出){ int lsd=0,slsd=0; 如果(n==0) 返回; 如果(n>0){ lsd=n%10; } 如果(n>9){

我遇到了一个我不知道答案的难题:“用递归函数将整数中的数字重新排列为两个一组”下面是一个例子:

输入:123456

幸运的是,有一种情况可以让它变得更简单,输入位数总是偶数

现在我做了一段时间的实验,但除了使用
printf
的无效解决方案外,我无法想出一个有效的解决方案


有没有人能给我一些灵感或想法来解决这个问题?

下面的程序应该可以

#包括
无效重新排列(整数n,整数*输出){
int lsd=0,slsd=0;
如果(n==0)
返回;
如果(n>0){
lsd=n%10;
}
如果(n>9){
slsd=(n%100)/10;
}
*输出=100*(*输出)+10*slsd+lsd;
n=n/100;
重新排列(n,输出);
}
int main(){
int n;
int输出=0;
scanf(“%d”和“&n”);
重新排列(n,&输出);
printf(“%d\n”,输出);
返回0;
}
这很容易理解,所以我不写任何评论

请注意,它是尾部递归的,因此使用O2优化,它可以无限递归。

尝试以下方法:

unsigned long pairinv(unsigned long number, unsigned long result) {

    unsigned long n = number % 100;   // Gets the two digit number
    if (n == 0) return result;        // If it's zero returns the result

    result = result * 100 + n;        // Else multiplies the result by 100, adds n
    return pairinv(number / 100, result); // and continues by recursion
}

int main() {
    unsigned long  r= 0;
    printf("%lu\n", pairinv(123456, r)); //==> 563412
    return 0;
}
我要咬:-)

unsigned long p(unsigned long p1,unsigned long p2){
//没有循环,没有数组,没有指针,没有全局,没有静态,没有变量,没有库
如果(p1<100)返回p2*100+p1;
返回p(p1/100,p2*100+p1%100);
}
无符号长pairinvert(无符号长n){
//没有循环,没有数组,没有指针,没有全局,没有静态,没有变量,没有库
如果(n<100)返回n;
返回p(n/100,n%100);
}
//需要printf()
#包括
内部主(空){
无符号长输入;
输入=123456;
printf(“重新排列int(%lu)=%lu\n”,输入,pairinvert(输入));
输入=42;
printf(“重新排列int(%lu)=%lu\n”,输入,pairinvert(输入));
输入=1234;
printf(“重新排列int(%lu)=%lu\n”,输入,pairinvert(输入));
}

如果位数是奇数怎么办?例如,12345。输出应该是什么?为了简单起见,永远不会是这种情况。递归函数应该至少有两部分:例如,终止条件和子任务条件。由于不需要从函数内部打印部分解决方案,因此还需要部分解决方案存储功能。这三者在这个问题上都很明显。唯一的问题是位数不均。如果您发现此答案是正确的,请向上投票并将其作为答案接受。感谢您花时间回答,尽管其可读性非常好,看起来技术上可行,但此解决方案仍然使用指针存储状态,这是不允许的。我注意到的一点是:您使用整数占位符(%d)进行打印,但该函数返回一个无符号长(%ld)值,并且在超过6位的情况下不起作用,idk whySorry我没有注意到这一点,但它现在已修复。哎哟,只是检查是否发布了新的响应,并注意到我实际上编写了错误的响应,它的%lu表示长时间未签名^^^我没有想到使用两个函数的可能性,这太棒了!谢谢你的时间和回答:)互联网是一个学习东西的好地方,感谢像你这样的人^^很高兴你没有抓住我的“作弊”——函数参数
p2
(或
p1
)是一个伪装变量:)如果允许你直接调用我的函数
p()
,你可以删除
pairinvert()
并使用
printf(“%lu\n”,p(输入,0))调用--仍在“伪装”中使用变量
printf("Rearrange int (%lu) = %lu", input, pairinvert(input));
unsigned long pairinv(unsigned long number, unsigned long result) {

    unsigned long n = number % 100;   // Gets the two digit number
    if (n == 0) return result;        // If it's zero returns the result

    result = result * 100 + n;        // Else multiplies the result by 100, adds n
    return pairinv(number / 100, result); // and continues by recursion
}

int main() {
    unsigned long  r= 0;
    printf("%lu\n", pairinv(123456, r)); //==> 563412
    return 0;
}
unsigned long p(unsigned long p1, unsigned long p2) {
    // no loops, no arrays, no pointers, no global, no static, no variables, no libraries
    if (p1 < 100) return p2*100 + p1;
    return p(p1/100, p2*100 + p1%100);
}

unsigned long pairinvert(unsigned long n) {
    // no loops, no arrays, no pointers, no global, no static, no variables, no libraries
    if (n < 100) return n;
    return p(n/100, n%100);
}

// need <stdio.h> for printf()
#include <stdio.h>

int main(void) {
    unsigned long input;
    input = 123456;
    printf("Rearrange int (%lu) = %lu\n", input, pairinvert(input));
    input = 42;
    printf("Rearrange int (%lu) = %lu\n", input, pairinvert(input));
    input = 1234;
    printf("Rearrange int (%lu) = %lu\n", input, pairinvert(input));
}