我正在尝试编写一些简单的代码来验证数组中每个数字的位数,但是我遇到了一些奇怪的行为。
数组中的前3个数字在while
循环中被评估为false,这意味着(120/1)%10
等于0,这不应该是真或其他错误。
你有什么想法吗?该算法在数组中的第3个数字之后按预期工作。
提前感谢您的建议。
int main(){
int nums[SIZE] = {120,210,3,4375,54443};
int i;
for (i = 0; i < SIZE; ++i){
printf("Var i inside FOR: \t%d\n", i);
printf("Var nums i inside FOR: \t%d\n", nums[i]);
int wtest = 1;
printf("Var wtest inside FOR: \t\t%d\n\n", wtest);
while (((nums[i] / wtest)%10) != 0){
wtest = wtest * 10;
printf("Var wtest iside while: \t\t\t%d\n\n", wtest);
}
}
getchar();
return 0;
}
输出:
Var i inside FOR: 0
Var nums i inside FOR: 120
Var wtest inside FOR: 1
Var i inside FOR: 1
Var nums i inside FOR: 210
Var wtest inside FOR: 1
Var i inside FOR: 2
Var nums i inside FOR: 3
Var wtest inside FOR: 1
Var wtest iside while: 10
Var i inside FOR: 3
Var nums i inside FOR: 4375
Var wtest inside FOR: 1
Var wtest iside while: 10
Var wtest iside while: 100
Var wtest iside while: 1000
Var wtest iside while: 10000
Var i inside FOR: 4
Var nums i inside FOR: 54443
Var wtest inside FOR: 1
Var wtest iside while: 10
Var wtest iside while: 100
Var wtest iside while: 1000
Var wtest iside while: 10000
Var wtest iside while: 100000
答案 0 :(得分:1)
您的代码逻辑错误。通过测试除法的余数为10,你实际检查相应位置的数字是零是否为零 - 这是最后一位数字120和210的情况。最后一位是你先检查的数字。
你应该只检查除法的结果是否为零:
int wtest = 1;
while (nums[i] / wtest != 0) {
wtest = wtest * 10;
}
如果nums[i]
小于wtest
,则除法产生零,因此您可以将其重写为:
int wtest = 1;
while (nums[i] > wtest) {
wtest = wtest * 10;
}
这当然不会给你数字计数,但是10的最小功率大于你的数字。
答案 1 :(得分:0)
int main(){
int nums[SIZE] = {120,210,3,4375,54443};
int i;
for (i = 0; i < SIZE; ++i){
printf("Var i inside FOR: \t%d\n", i);
printf("Var nums i inside FOR: \t%d\n", nums[i]);
int j = 0;
int n = nums[i];
do
{
n=n/10;
j++;
}while(n!=0);
}
}
getchar();
return 0;
}
这里do-while循环将计算数字中的位数,数字0将被计为1使用do而不是while的原因。希望这对你有所帮助。