菜菜一枚,请问大神为什么我的程序会运行异常呢
/*有5个各不相同的正整数,他们的和是135, 且按照从小到大的顺序,后面一个数是前面一个数的 整数倍,编写程序求这5个数。*/
#include <stdio.h>
#define N 150
int main(){
int a,b,c,d,e;
for(a = 0;a <= N;a++)
for(b = 0;b <= N;b++)
if(a != b && b > a && b % a == 0)
for(c = 0;c <= N;c++)
if(c != a && c != b && c > b && c % b == 0)
for(d = 0;d <= N;d++)
if(d != a && d != b && d != c && d > c && d % c == 0)
for(e = 0;e <= N;e++)
if(e != a && e != b && e != c && e != d
&& e > d && e % d == 0)
if(a + b + c + d + e == 135)
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n",a,b,c,d,e);
return 0;
}
你的思路中有很多重复的地方比如a从1开始,则b只能从2开始,就是一直从a+1开始就对了,而不是每次都要从0开的
麻烦问下我的思路是哪块出了问题呢
问题主要是求余%第二个数不能为0,但是你从0开始,所以会有bug
1,2,4,8,120=135
int a,b,c,d,e;
for (a=1;a<27;a++) {
for (b=(2*a);b<135;b++) {
for (c=(b*2);c<135;c++) {
for (d=(c*2);d<135;d++) {
for (e=(d*2);d<135;e++) {
if((a+b+c+d+e)==135){
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
谢谢各位帮助,最后的代码整理了下,如果有需要改进的地方请再多指教
#include <stdio.h>
#include <time.h>
#define N 131
int main(){
int a,b,c,d,e;
clock_t s,f;
s = clock();
for(a = 1;a <= N;a++)
for(b = a + 1;b <= N;b++)
if(a != b && b > a && b % a == 0)
for(c = b + 1;c <= N;c++)
if(c != a && c != b && c > b && c % b == 0)
for(d = c + 1;d <= N;d++)
if(d != a && d != b && d != c && d > c && d % c == 0)
for(e = d + 1;e <= N;e++)
if(e != a && e != b && e != c && e != d
&& e > d && e % d == 0)
if(a + b + c + d + e == 135)
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n",a,b,c,d,e);
f = clock();
printf("%lf",(f - s) / CLOCKS_PER_SEC);
return 0;
}
被那么多层for循环吓到了。
这一题既然每个数都是第一个数的整数倍,则和必然也是第一个数的整数倍,所以可以先对135作因式分解:135=5*3*3*3
所以第一个数是3或者5或者9(由于5个数各不相同,所以很容易排除第一个数是15和27,45,135的可能),之后就是把135除以第一个数之后的数字拆成5个不同的整数(第一个整数为1)之和。
(1) 第一个数为3,打印出和为45的所有5个不同的正整数组合
(2) 第一个数为5,打印出和为27的所有5个不同的正整数组合
(3) 第一个数为9,打印出和为15的所有5个不同的正整数组合,这个只有一组,就是1,2,3,4,5。对应的5个正整数为9,18,27,36,45