该函数应获取整数的地址,并通过在数字之间插入零来修改它。例如:
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位数的数字。
老实说,到目前为止我还不太明白这是如何实现的。如果有人能解释一下这是如何实现的,我将非常感激。
4条答案
按热度按时间atmip9wb1#
正如注解中所指出的,您对
scanf
的使用是不正确的。您需要传递一个指针作为第二个参数。r8xiu3jd2#
插入零有一个简单的递归公式:
IZ(n) = 100*IZ(n/10) + n%10
.这给出了一个非常简洁的解决方案--这里的测试用例是比实际函数本身更多的代码。
输出量:
wbrvyc0a3#
改编刚刚发布的一些代码,用于下面这些愚蠢的练习:
在int中存储的十进制值有一个上限,如果你想开始处理数字串,那就完全是另一回事了。
w51jfk4q4#
编辑:如果这是在Java中,这将是一个解决方案,但问题是在C中,我不确定这是否可以转换为C。
如果你先把整数转换成字符串,然后用for循环把零加起来,再转换成整数,这可能会容易得多。例如:
我想这应该能给予你想要的效果。我已经有一段时间没有使用Java了(我现在正在使用JavaScript),所以我希望没有语法错误,但是逻辑应该都是正确的。