C语言 一种函数,它接受一个整数并在其数字之间插入零

zzwlnbp8  于 2022-12-11  发布在  其他
关注(0)|答案(4)|浏览(114)

该函数应获取整数的地址,并通过在数字之间插入零来修改它。例如:

insert_zeros(3) //3
insert_zeros(39) //309
insert_zeros(397) //30907
insert_zeros(3976) //3090706
insert_zeros(39765) //309070605

我的代码:

#include <stdio.h>
#include <math.h>

void insert_zeros(int* num);

int main() {

    int num;

    printf("Enter a number:");
    scanf("%d", num);

    insert_zeros(&num);

    printf("Number after inserting zeros: %d", num);

    return 0;
}

void insert_zeros(int* num){
    int count = 0;
    int tmp = *num;

    //Count the number of digits in the number
    while(tmp != 0){
        tmp /= 10;
        count++;
    }

    //calculating the coefficient by which I will divide the number to get its digits one by one
    int divider = (int)pow(10, count-1);
    int multiplier;

    tmp = *num;
    *num = 0;

    /*
    The point at which I'm stuck
    Here I tried to calculate the degree for the number 10
    (my thought process and calculations are provided below)
    */
    (count >= 3)? count += (count/2): count;

    //the main loop of assembling the required number
    while (count >= 0){
        multiplier = (int)pow(10, count);       //calculating a multiplier
        *num += (tmp / divider) * multiplier;   //assembling the required number
        tmp %= divider;                         //removing the first digit of the number
        divider /= 10;                          //decreasing divider
        count -= 2;                             //decreasing the counter,
                                                //which is also a power of the multiplier (witch is 10)
    }
}

我的想法由以下公式组成:
对于数字“3”,我应该得到“30”,它将是:
30 =(3 * 10^1)-幂是等于1的数字“3”的计数器。
对于数字“39”,则为“309”:
309 =(3 * 10^2)+(9 * 10^1)
对于编号“397”,将为“30907”:
30907 =(3 * 10^4)+(9 * 10^2)+(7 * 10^0)
对于编号“3976”,将为“3090706”:
3090706 =(3 * 10^6)+(9 * 10^4)+(7 * 10^2)+(6 * 10^0)-每次迭代的功效递减2
对于编号“39765”,将为“309070605”:
309070605 =(3 * 10^8)+(9 * 10^6)+(7 * 10^4)+(6 * 10^2)+(5 * 10^0)
等等......
对于3位数的数字,起始幂应为4,对于4位数的数字,幂应为6,对于5位数的数字,幂应为8,对于6位数的数字,幂应为10,等等。
这个算法一直工作到它接受一个5位数的数字。它输出一个像“30907060”这样的数字,最后多了一个“0”。主要的问题是在这段代码(count >= 3)? count += (count/2): count;中,在这里我试着计算第一次迭代循环的正确幂,它应该给予正确的数字,然后加上下面所有的数字。但它只工作,直到它得到一个5位数的数字。
老实说,到目前为止我还不太明白这是如何实现的。如果有人能解释一下这是如何实现的,我将非常感激。

atmip9wb

atmip9wb1#

正如注解中所指出的,您对scanf的使用是不正确的。您需要传递一个指针作为第二个参数。

#include <stdio.h>
#include <math.h>

int main(void) {
    int num;
    scanf("%d", &num);

    int num2 = 0;
    int power = 0;

    while (num > 0) {
        num2 += (num % 10) * (int)pow(10, power);
        num /= 10;
        power += 2;
    }

    printf("%d\n", num2);

    return 0;
}
r8xiu3jd

r8xiu3jd2#

插入零有一个简单的递归公式:IZ(n) = 100*IZ(n/10) + n%10 .
这给出了一个非常简洁的解决方案--这里的测试用例是比实际函数本身更多的代码。

#include <stdio.h>
#include <stdint.h>

uint64_t insert_zeros(uint64_t n) {
    return n ? (100 * insert_zeros(n / 10) + n % 10) : 0;
}

int main(int argc, char **argv) {
    int tc[] = {1, 12, 123, 9854, 12345, 123450};
    for (int i = 0; i < sizeof(tc)/sizeof(*tc); i++) {
        printf("%d -> %lu\n", tc[i], insert_zeros(tc[i]));
    }
}

输出量:

wbrvyc0a

wbrvyc0a3#

改编刚刚发布的一些代码,用于下面这些愚蠢的练习:

int main() {
    int v1 = 12345; // I don't like rekeying data. Here's the 'seed' value.

    printf( "Using %d as input\n", v1 );

    int stack[8] = { 0 }, spCnt = -1;
    // Peel off each 'digit' right-to-left, pushing onto a stack
    while( v1 )
        stack[ ++spCnt ] = v1%10, v1 /= 10;

    if( spCnt == 0 ) // Special case for single digit seed.
        v1 = stack[ spCnt ] * 10;
    else
        // multiply value sofar by 100, and add next digit popped from stack.
        while( spCnt >= 0 )
            v1 = v1 * 100 + stack[ spCnt-- ];

    printf( "%d\n", v1 );

    return 0;
}

在int中存储的十进制值有一个上限,如果你想开始处理数字串,那就完全是另一回事了。

w51jfk4q

w51jfk4q4#

编辑:如果这是在Java中,这将是一个解决方案,但问题是在C中,我不确定这是否可以转换为C。
如果你先把整数转换成字符串,然后用for循环把零加起来,再转换成整数,这可能会容易得多。例如:

int insert_zeros(int num) {

    String numString = Integer.toString(num);
    String newString = "";
    
    int numStringLength = numString.length();
    for (int i = 0; i < numStringLength; i++) {
        newString += numString[i];

        // Only add a 0 if it's not the last digit (with exception of 1st digit)
        if (i < numStringLength - 1 || i == 0) newString += '0';
    }

    return Integer.parseInt(newString);
}

我想这应该能给予你想要的效果。我已经有一段时间没有使用Java了(我现在正在使用JavaScript),所以我希望没有语法错误,但是逻辑应该都是正确的。

相关问题