我正在尝试编写一个程序,它将在表单中打印给定数字的阶乘: 10!= 2 ^ 8 * 3 ^ 4 * 5 ^ 2 * 7 为了使它快速,让我们说给定的数字是10,我们事先得到素数。我不想先计算阶乘。因为如果给定的数字更大,它最终将超出int类型的范围。所以我遵循的算法是: 首先计算两个人的力量。在1到10之间有五个数字,两个分为两个。这些数字给出2 * 1,2 * 2,......,2 * 5。此外,两个也在集合{1,2,3,4,5}中划分两个数字。这些数字是2 * 1和2 * 2。继续这种模式,在一到二之间有一个数字,两个分成两个。然后a = 5 + 2 + 1 = 8.
现在看看三个人的力量。从1到10有三个数字,三个分成三个,然后一个数字在一到三之间,三个数字分成三个数字。因此b = 3 + 1 = 4。以类似的方式c = 2。然后集合R = {8,4,2,1}。最后的答案是:
10!= 2 ^ 8 * 3 ^ 4 * 5 ^ 2 * 7
所以我写的是:
<ImageView
android:id="@+id/android_cookie_image_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scaleType="centerCrop"
android:src="@drawable/before_cookie" />
,输出为(2 ^ 3)(3 ^ 2)(5 ^ 1)(7 ^ 1)。 我无法理解我的代码有什么问题。有人可以帮帮我吗?
答案 0 :(得分:1)
更简单的方法:
#include <stdio.h>
int main(int argc, char const *argv[])
{
const int n = 10;
const int primes[] = {2,3,5,7};
for(int i = 0; i < 4; i++){
int cur = primes[i];
int total = 0;
while(cur <= n){
total += (n/cur);
cur = cur*primes[i];
}
printf("(%d^%d)\n", primes[i], total);
}
return 0;
}
答案 1 :(得分:0)
当某个素数可以对其进行整除时,你的代码会对n进行分割,从而使n跳跃。
e.g。当n = 10且i = 0时,进入while循环,n可被2整除(arr [0]),导致n = 5.所以你跳过n = [9..5)
你应该做的是在划分时应该使用temp,如下所示:
#include <stdio.h>
main()
{
int i, n, count;
int ara[]={2, 3, 5, 7};
for(i=0; i<4; i++)
{
count=0;
for(n=10; n>0; n--)
{
int temp = n;
while(temp%ara[i]==0)
{
count++;
temp=temp/ara[i];
}
}
printf("(%d^%d)" , ara[i], count);
}
return 0;
}
答案 2 :(得分:-3)
寻找无pl的阶乘。试试这段代码:
#include <stdio.h>
int main()
{
int c, n, fact = 1;
printf("Enter a number to calculate it's factorial\n");
scanf("%d", &n);
for (c = 1; c <= n; c++)
fact = fact * c;
printf("Factorial of %d = %d\n", n, fact);
return 0;
}