C 程序查找给定数字的 FACTORIAL 末尾的尾随零
C program to find the trailing ZEROS at the end of a FACTORIAL of a given number
我有 return 查找阶乘并在阶乘末尾显示尾随零的代码,但输出是错误的...你能帮我找出错误吗?
#include <stdio.h>
int main() {
int m = 1, i, N, count = 0;
scanf("%d", &N);
for (i = 1; i <= N; i++) {
m = m * i;
}
printf("%d", m);
while (m > 0) {
if ((m % 10) == 0) {
count = count + 1;
m = m / 10;
}
break;
}
printf("%d", count);
return 0;
}
你有两个问题
- 你折叠了两个输出,所以你只能看到其中一个/你看不到谁是谁,只需在它们之间添加一个分隔符
- 你数的时候少了一个 else,所以你数到 1,阶乘 10 的结果是错误的
所以最小的变化会产生:
int main()
{
int m=1,i,N,count=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
m=m*i;
}
printf("%d\n",m); /* <<< added \n */
while(m>0)
{
if((m%10)==0)
{
count=count+1;
m=m/10;
}
else /* <<< added else */
break;
}
printf("%d\n",count); /* <<< added \n */
return 0;
}
更改后:
pi@raspberrypi:/tmp $ ./a.out
5
120
1
pi@raspberrypi:/tmp $ ./a.out
10
3628800
2
当然,首先假设您能够计算阶乘而不会溢出
我还鼓励您检查 scanf 读取的值,检查它 returns 1
您的代码仅适用于非常小的 N
值:最大 9
。对于稍大的值,您需要在 break
语句之前添加一个 else
关键字,并且您会在更多情况下获得正确的结果。
对于较大的值,您必须计算除阶乘的 5 次方。您可以通过将每个单独数字除以 N
.
的 5 的幂求和来逐步执行此操作
#include <stdio.h>
int main() {
int N, count;
if (scanf("%d", &N) != 1)
return 1;
/* only consider factors that are multiples of 5 */
count = 0;
for (int i = 5; i <= N; i += 5) {
for (int j = i; j % 5 == 0; j /= 5)
count++;
}
printf("%d\n", count);
return 0;
}
一个更简单和更快的解决方案是:计算小于或等于N
的5
的倍数,加上5*5
的倍数,等等
代码如下:
#include <stdio.h>
int main() {
int N, count;
if (scanf("%d", &N) != 1)
return 1;
count = 0;
for (int i = N; (i /= 5) > 0;) {
count += i;
}
printf("%d\n", count);
return 0;
}
#include <stdio.h>
int main()
{
int n,i,f=1,t,c=0;
printf("Enter number ");
scanf("%d",&n);
t=n;
for(i=1;t>=5;i++)
{
t=n/5;
c=c+t;
n=t;
}
printf("number of zeros are %d",c);
return 0;
}
我有 return 查找阶乘并在阶乘末尾显示尾随零的代码,但输出是错误的...你能帮我找出错误吗?
#include <stdio.h>
int main() {
int m = 1, i, N, count = 0;
scanf("%d", &N);
for (i = 1; i <= N; i++) {
m = m * i;
}
printf("%d", m);
while (m > 0) {
if ((m % 10) == 0) {
count = count + 1;
m = m / 10;
}
break;
}
printf("%d", count);
return 0;
}
你有两个问题
- 你折叠了两个输出,所以你只能看到其中一个/你看不到谁是谁,只需在它们之间添加一个分隔符
- 你数的时候少了一个 else,所以你数到 1,阶乘 10 的结果是错误的
所以最小的变化会产生:
int main()
{
int m=1,i,N,count=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
m=m*i;
}
printf("%d\n",m); /* <<< added \n */
while(m>0)
{
if((m%10)==0)
{
count=count+1;
m=m/10;
}
else /* <<< added else */
break;
}
printf("%d\n",count); /* <<< added \n */
return 0;
}
更改后:
pi@raspberrypi:/tmp $ ./a.out
5
120
1
pi@raspberrypi:/tmp $ ./a.out
10
3628800
2
当然,首先假设您能够计算阶乘而不会溢出
我还鼓励您检查 scanf 读取的值,检查它 returns 1
您的代码仅适用于非常小的 N
值:最大 9
。对于稍大的值,您需要在 break
语句之前添加一个 else
关键字,并且您会在更多情况下获得正确的结果。
对于较大的值,您必须计算除阶乘的 5 次方。您可以通过将每个单独数字除以 N
.
#include <stdio.h>
int main() {
int N, count;
if (scanf("%d", &N) != 1)
return 1;
/* only consider factors that are multiples of 5 */
count = 0;
for (int i = 5; i <= N; i += 5) {
for (int j = i; j % 5 == 0; j /= 5)
count++;
}
printf("%d\n", count);
return 0;
}
一个更简单和更快的解决方案是:计算小于或等于N
的5
的倍数,加上5*5
的倍数,等等
代码如下:
#include <stdio.h>
int main() {
int N, count;
if (scanf("%d", &N) != 1)
return 1;
count = 0;
for (int i = N; (i /= 5) > 0;) {
count += i;
}
printf("%d\n", count);
return 0;
}
#include <stdio.h>
int main()
{
int n,i,f=1,t,c=0;
printf("Enter number ");
scanf("%d",&n);
t=n;
for(i=1;t>=5;i++)
{
t=n/5;
c=c+t;
n=t;
}
printf("number of zeros are %d",c);
return 0;
}