#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c;
b=1;
a=0;
scanf("%d", &a);
while (a>0)
{
c=a%10;
if (c==0)
b=b*1;
else {
b=b*(a%10);
a=a/10;
}
}
printf("Proizvedenie: %dn", b);
return 0;
}
当我在数字的任何位置添加 0 时它不起作用,但我添加了 if 并且不知道为什么它不起作用,循环只是没有结束,请帮助
01234 - 24; Right
1234 - 24; Right
12304 - doesnt work
12340 - doesnt work
为什么请帮助=(
只有当当前数字不是 0 时,您才将a
除以 10。 当数字为 0 时,a
保持不变,并且 u 和向上处于无限循环中。
将a
的更新移到if
块的外部。 此外,b=b*1
是无操作,因此您可以将其删除。
while (a>0)
{
c=a%10;
if (c!=0) {
b=b*c;
}
a=a/10;
}
你只在else
块中做a = a/10
。因此,当您达到0
位数时,您停止除以 10 并陷入无限循环。
把那条线从if/then
中取出,因为它每次都需要完成。
while (a>0)
{
c=a%10;
if (c!=0) {
b *= c;
}
a /= 10;
}
unsigned int product(int x)
{
int result = !!x;
while(x)
{
if(x % 10) result *= abs(x % 10);
x /= 10;
}
return result;
}
int main(void)
{
int testData[] = {0, 1234, 12304, 12340, -1234, -12304, -012340 /* <- octal number!! */};
for(int x = 0; x < sizeof(testData)/sizeof(testData[0]); x ++)
printf("%d - %un", testData[x], product(testData[x]));
}
https://godbolt.org/z/T8T1a5YEE
- 使用函数。
- 整数也可以是负数
- 你也需要处理零。
在您的代码中:
c=a%10;
if (c==0)
b=b*1;
else {
b=b*(a%10);
a=a/10;
}
您需要将a = a / 10
移出if
,因为它仅在a % 10
不为零时才执行。如果是,a
不会改变,你处于不定式循环中
其他人已经注意到您的代码中的缺陷(a=a/10;
在代码块中的位置else
。
这是实现目标的无分支方法。 "分支"(使用if()
条件)会使代码在处理器的管道预测被证明是错误的时运行得更慢。在处理数百万(或数十亿)数据项时,这可能是一笔巨大的时间成本。
#include <stdio.h>
#include <stdlib.h>
int main() {
int a = 0, prod = 1;
if( scanf( "%d", &a ) != 1 ) {
fprintf( stderr, "scanf failedn" );
return 1;
}
for( a = abs(a); a; a /= 10 ) {
int r = a%10;
prod *= r+(r==0); // branchless technique
}
printf( "Proizvedenie: %dn", prod );
return 0;
}
54300012
Proizvedenie: 120
当r
的值为 1-9 之一时,r==0
的值为 0。
当r
的值为 0 且r==0
的值为 1 时。
因此,10 个不同的 rhs 值可以是 1、1、2、3、4、5、6、7、8 或 9。