当我使用 1 位数字时,此代码正确地 运行。但它一直落后于更多的数字
This code is running properly when I use 1 digit numbers. But It's keep lagging on more digit numbers
出了点问题。我正在尝试制作一个可以计算任何自然数的数字的 cade。就像 2 的计数是 1,30 是 2,456 是 3。我的代码是 运行 用于 1 位数字而不是两位数。
#include<stdio.h>
void main(void)
{
int num,count,check;
float div;
printf("Enter a natural number\n");
scanf("%d", &num);
while (num<=0)
{
printf("Error\n");
printf("Enter a number\n");
scanf("%d", &num);
}
while(num>1)
{
count=1;
check=10;
div=num/check;
if(div<=1)
{
printf("Number count is\n%d", count);
break;
}
check = check*10;
count = count+1;
}
}
你的解决方案的问题是,在循环结束时修改check
和count
后,它们被重新声明为1
和10
分别在每个段落的循环开始处。
您需要将声明移到 while 循环之前。
另外 div
不需要是 float
,因为这个数字的小数部分是无关紧要的。
您还可以通过将 check
替换为 10
和
直接使用 num
而不是将结果临时存储在 div
.
我认为这可能是一个更简单的解决方案
#include <stdio.h>
int main(){
int num = 0, digits = 0;
while (num <= 0)
{
printf("Enter a natural number\n");
scanf("%d", &num);
num == 0 ? printf("Error\n") : 0;
}
for( ; num > 0; digits++)
num /= 10;
printf("number of digits: %d\n", digits);
}
随着 num
连续除以 10,结果的小数点被截断,因为 num
是一个 int
而 digits
稳步增加。
是时候学习使用调试器了。使用它会立即显示代码中的主要问题:您在循环中重置 count
和 check
的值 。因此,如果您输入一个大于或等于 10 的数字,您将进入一个无限循环,因为您将始终将该数字除以 10,并发现结果 >= 1!
还有一个不太重要的问题:你用了if(div<=1)
,而它应该是if(div<1)
。因为 10/10 是 1 并且有 2 个数字...
完成这些修复后,您应该:
...
check = 10;
count = 1;
while (num > 1)
{
div = num / check;
if (div < 1)
{
printf("Number count is\n%d", count);
break;
}
check = check * 10;
count = count + 1;
}
return 0; // main shall return an int value to its environment...
}
正确给出正整数的小数位数。但是正如您在评论中所说,您应该 始终 测试 scanf
的 return 值(用户无意中输入的是什么 t 而不是 5 例如?)。
话虽如此,这个答案旨在向您展示问题所在,但 Keyne 的解决方案更好...
出了点问题。我正在尝试制作一个可以计算任何自然数的数字的 cade。就像 2 的计数是 1,30 是 2,456 是 3。我的代码是 运行 用于 1 位数字而不是两位数。
#include<stdio.h>
void main(void)
{
int num,count,check;
float div;
printf("Enter a natural number\n");
scanf("%d", &num);
while (num<=0)
{
printf("Error\n");
printf("Enter a number\n");
scanf("%d", &num);
}
while(num>1)
{
count=1;
check=10;
div=num/check;
if(div<=1)
{
printf("Number count is\n%d", count);
break;
}
check = check*10;
count = count+1;
}
}
你的解决方案的问题是,在循环结束时修改check
和count
后,它们被重新声明为1
和10
分别在每个段落的循环开始处。
您需要将声明移到 while 循环之前。
另外 div
不需要是 float
,因为这个数字的小数部分是无关紧要的。
您还可以通过将 check
替换为 10
和
直接使用 num
而不是将结果临时存储在 div
.
我认为这可能是一个更简单的解决方案
#include <stdio.h>
int main(){
int num = 0, digits = 0;
while (num <= 0)
{
printf("Enter a natural number\n");
scanf("%d", &num);
num == 0 ? printf("Error\n") : 0;
}
for( ; num > 0; digits++)
num /= 10;
printf("number of digits: %d\n", digits);
}
随着 num
连续除以 10,结果的小数点被截断,因为 num
是一个 int
而 digits
稳步增加。
是时候学习使用调试器了。使用它会立即显示代码中的主要问题:您在循环中重置 count
和 check
的值 。因此,如果您输入一个大于或等于 10 的数字,您将进入一个无限循环,因为您将始终将该数字除以 10,并发现结果 >= 1!
还有一个不太重要的问题:你用了if(div<=1)
,而它应该是if(div<1)
。因为 10/10 是 1 并且有 2 个数字...
完成这些修复后,您应该:
...
check = 10;
count = 1;
while (num > 1)
{
div = num / check;
if (div < 1)
{
printf("Number count is\n%d", count);
break;
}
check = check * 10;
count = count + 1;
}
return 0; // main shall return an int value to its environment...
}
正确给出正整数的小数位数。但是正如您在评论中所说,您应该 始终 测试 scanf
的 return 值(用户无意中输入的是什么 t 而不是 5 例如?)。
话虽如此,这个答案旨在向您展示问题所在,但 Keyne 的解决方案更好...