我在C中创建一个程序,使输出看起来像这样:
2 = 2
3 = 3
4 = 2 x 2
5 = 5
6 = 2 x 3
....
102 = 2 x 3 x 17
103 = 103
104 = 2 x 2 x 2 x 13
我用以下方式编写了整数分解代码:
#include <stdio.h>
#define MAXNUM 1000
int main(){
int num,numfordiv;
int div = 2;
for (num=2;num<MAXNUM;num++){
printf("%d=", num);
numfordiv = num;
if(num%div != 0){
div = div+1;
}
else{
numfordiv = numfordiv / div;
printf("%d x ",div);
if(numfordiv == 1){
div = 2;
}
}
}
return 0;
}
然而,由于未知原因,这不起作用。循环有什么问题吗?
答案 0 :(得分:3)
生成请求的输出所能做的至少是
#include <stdio.h>
#define MAXNUM 1000
int main()
{
int num,numfordiv;
int div = 2;
for (num=2;num<MAXNUM;num++)
{
printf("%d= ", num);
numfordiv = num;
div = 2;
while (numfordiv>1)
{
if(numfordiv%div != 0)
{
div++;
}
else
{
numfordiv /= div;
printf("%d ",div);
if(numfordiv != 1)
{
printf("x ");
}
}
}
printf("\n");
}
return 0;
}
如您所见,您需要:
答案 1 :(得分:1)
@LP的答案很简单易懂。
但是,如果性能很重要,那么对于非常高的MAXNUM
值存在缺陷。由于div
在while
循环中仅增加1,因此对于高数字性能将是不好的,因为代码会测试很多将失败的div值。一个简单的例子:没有必要将div
设置为4,6,8,10等。
下面是一个对高数字表现更好的例子。代价更复杂,内存使用更多。
基本思想是在检测到时填充素数并仅将div
设置为素数值,以便代码跳过许多永远不会通过%
测试的数字。
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 200000000
#define INCREASE_BY 1000
int main()
{
// Make array for collecting primes
int primes_array_size = INCREASE_BY;
int *primes = malloc(primes_array_size * sizeof(int));
if (primes == NULL)
{
printf("out of memory\n");
return 0;
}
// Add 2 as the first prime
primes[0] = 2;
int num_primes = 1;
int prime_pos = 0;
int num,numfordiv;
int div = 2;
for (num=2;num<MAXNUM;num++)
{
div = primes[0];
prime_pos = 0;
printf("%d = ", num);
numfordiv = num;
while(numfordiv>1)
{
if(numfordiv % div != 0)
{
// Goto next prime (if there are any)
++prime_pos;
if (prime_pos < num_primes)
{
div = primes[prime_pos];
}
else
{
// No more primes in the list
break;
}
}
else
{
numfordiv = numfordiv / div;
printf("%d",div);
if (numfordiv != 1) printf(" x ");
}
}
if (numfordiv != 1)
{
// Found new prime - add it
primes[num_primes] = num;
++num_primes;
printf("%d",num);
if (num_primes == primes_array_size)
{
// Allocate more memory
primes_array_size = primes_array_size + INCREASE_BY;
int* tmp = realloc(primes, primes_array_size * sizeof(int));
if (tmp == NULL)
{
printf("out of memory\n");
free(primes);
return 0;
}
primes = tmp;
}
}
printf("\n");
}
free(primes);
return 0;
}