void print(int num, int digits)
{
double mod, divi;
int mod1, divi1;
mod = pow(10, digits);
divi = pow(10, digits-1);
mod1 = (int)mod;
divi1 = (int)divi;
if(digits > 0)
{
printf("%d\n", ((num%mod1)/divi1));
digits--;
print(num, digits);
}
else
{
return;
}
}
此功能用于垂直打印'num'中的数字,但是当我运行它时,它打印的唯一内容是0。我知道它得到正确的位数,因为它打印的数字与数字中的数字相同,所以我在这里使用Modulo或Division时出现问题,我似乎无法找到它。任何帮助将不胜感激,谢谢!
获取数字的功能(可能问题在这里?):
void getNum()
{
int num, digits=0;
printf("Enter a number to be printed vertically: ");
scanf("%d", &num);
if(num < 0)
{
digits = 1;
}
while(num)
{
num = num/10; //Here was the problem. Num was 0 once i passed it to print()
digits++; //Simply added a new variable to fix it. Thanks all!
}
print(num, digits);
}
答案 0 :(得分:1)
我没有看到你的代码有什么问题,除了它太复杂并且不必要地使用浮点数学。
这是另一种选择:
void print(int num, int digits)
{
if (digits > 0) {
print(num / 10, digits - 1);
printf("%d\n", num % 10);
}
}
诀窍是在递归调用之后移动打印。这允许更简单的逻辑。
答案 1 :(得分:0)
这是我的问题的解决方法。在将num传递给函数之前,我将num设置为0。我只是声明了另一个变量num1在while循环中使用,而不是传递给函数的实际num。
void getNum()
{
int num, num1, digits=0;
//get the num
printf("Enter a number to be printed vertically: ");
scanf("%d", &num);
num1 = num;
//Loop to find how many digits are in the number
while(num1)
{
num1 = num1/10;
digits++;
}
//call function to print
print(num, digits);
}
答案 2 :(得分:0)
在NPE answer上所做的改动很小,我可以找到消除digits
参数并适用于负数的代码版本。
代码
void print(int num)
{
if (num < 0){
num *=-1;
}
if (num > 0) {
print(num / 10);
printf("%d\n", num % 10);
}
}
[Edit1 and 2] :正确的INT_MIN
溢出
感谢chux提出的建设性意见,我更正了INT_MIN否定溢出的可能。 Another similar topic by chux 。
void print(int num)
{
#if INT_MIN < -INT_MAX
///In two's complements systems.
///handle special case
if ( num == INT_MIN ) {
//fprintf(stderr, "Houston, we have a problem\n");
// Maybe return or exit here.
//~ 2147483647 -> 2147483648
print(INT_MAX/10);
print(INT_MIN%10); //portable version ///print(8);
return;
}
if (num < 0){
//num =-((unsigned)num);
num *=-1;
}
#endif
if (num > 0) {
print(num / 10);
printf("%d\n", num%10);
}
}
现在,如果我们拨打print()
int number = INT_MIN;// a negative number
print(-120);
printf("\n");
print(-321);
print(number);
输出
1
2
0
3
2
1
Houston, we have a problem
[Edit3]
更改代码使其也可以print(0)
使用。
int zeroSignal=1;
void print(int num)
{
#if INT_MIN < -INT_MAX
///In two's complements systems.
///handle special case
if ( num == INT_MIN ) {
///fprintf(stderr, "Houston, we have a problem\n");
// Maybe return or exit here.
//~ 2147483647 -> 2147483648
print(INT_MAX/10);
print(INT_MIN%10); //portable version ///print(8);
return;
}
if (num < 0){
//num =-((unsigned)num);
num *=-1;
}
#endif
if (num==0 && zeroSignal){
printf("Only zero: %d\n", 0);
}
if (num > 0) {
zeroSignal = 0;
print(num / 10);
printf("%d\n", num%10);
}
zeroSignal = 1;
}
在上面的代码中,我使用全局整数zeroSignal
来实现一种适用于print(0)
的方式。