C 上不包括 0 的数字的乘积

  • 本文关键字:数字 不包括 c
  • 更新时间 :
  • 英文 :

#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

  1. 使用函数。
  2. 整数也可以是负数
  3. 你也需要处理零。

在您的代码中:

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。

最新更新