我在大学里有一个作业,要输入两个数字,并用蛮力获得它们的各个除数,将它们存储在数组中,然后打印出来。接下来,我们被要求使用两个数组之间的比较来获得它们的公共除数,然后创建一个包含公共除数的数组,然后打印它们。
下面的代码很好用
int main() {
int n1, n2, i, j, n, k, l, m, u, h, test ;
int divisors1[100] ;
int divisors2[100] ;
int common_div[100] ;
int up_limit, low_limit ;
printf("Enter an integer") ;
scanf("%d", &n1) ;
printf("Enter an integer") ;
scanf("%d", &n2) ;
for(i = 1, j = 0, k = 0; i <= n ; i++){
if(n1 % i == 0){
divisors1[j] = i ;
j++ ;
}
if(n2 % i == 0){
divisors2[k] = i ;
k++ ;
}
}
// printf("The divisors of %d are ", n1);
for(l = 0 ; l < j ; l++){
printf("%d ", divisors1[l]) ;
}
printf("\n") ;
// printf("The divisors of %d are ", n2) ;
for(l = 0; l < k ; l++){
printf("%d ", divisors2[l]) ;
}
}
但是,在我添加了这个新的报价块之后,似乎没有任何代码有效。上一个和下一个都不是。我在代码第一部分的末尾添加了代码。
up_limit = 0 ;
low_limit = 0 ;
if(j > k){
up_limit = j ;
low_limit = k ;
}else{
up_limit = k ;
low_limit = j ;
}
if(up_limit == j){
for(m = 0; m < up_limit ; m++){
test = divisors1[m] ;
for(h = 0, u = 0 ; h < low_limit; h++){
printf("%d", divisors2[h]) ;
if(test == divisors2[h]){
common_div[u] = divisors2[h] ;
u++ ;
}
}
}
}else{
for(m = 0; m < up_limit ; m++){
test = divisors2[m] ;
for(h = 0, u = 0 ; h < low_limit; h++){
printf("%d", divisors1[h]) ;
if(test == divisors1[h]){
common_div[u] = divisors2[h] ;
u++ ;
}
}
}
}
printf("The common divisors are \n") ;
for(i = 0; i < u ; i++){
printf("%d ", common_div[u]) ;
}
我的主要问题是为什么在这种情况下printf会不正常地工作。 这是我添加代码
之后的示例输出Enter an integer 345
Enter an integer345
The common divisors are
答案 0 :(得分:0)
您的节目展示了undefined behaviour。
问题在这里:
for (i = 1, j = 0, k = 0; i <= n; i++) {
if (n1 % i == 0) {
...
变量n
从未被初始化(IOW,您从未在其中添加任何内容),因此它包含一个不确定的值。如果程序可以运行,那完全是巧合。
除非您不解决此问题,否则一旦添加附加代码,调查该程序为何不再起作用是毫无意义的。
您的程序可能的解决方法是:
替换此部分:
for(i = 1, j = 0, k = 0; i <= n ; i++){
if(n1 % i == 0){
divisors1[j] = i ;
j++ ;
}
if(n2 % i == 0){
divisors2[k] = i ;
k++ ;
}
}
与此:
for (i = 1, j = 0; i <= n1; i++) {
if (n1 % i == 0) {
divisors1[j] = i;
j++;
}
}
for (i = 1, k = 0; i <= n2; i++) {
if (n2 % i == 0) {
divisors2[k] = i;
k++;
}
}
更多提示:
j
,k
等替换为有意义的名称,例如nbdivisors1
,nbdivisors2
等)。i
是一个例外,它是通常用作循环索引。免责声明:第二部分可能还有更多问题
答案 1 :(得分:-1)
您正在打印common_div [u]。也许您想打印common_div [i]?因为索引u处的数组没有任何值。
printf("The common divisors are \n") ;
for(i = 0; i < u ; i++){
printf("%d ", common_div[u]) ;
}