解题思路: 我们看到这道题首先想到的肯定是用for循环来暴力破解
例如:
#include <stdio.h> void f() //利用4层for求符合条件的数量 { int e,sum=0,a,b,c,d; //sum记录符合条件的数量 scanf("%d",&e); for(a=1;a<e;a++) { if(a>=e-2) break; for(b=1;b<e;b++) { if(b>e-a) break; //当b>e-a的时候a+b+c+d的值必大于e,因此跳出循环减少运算量 for(c=1;c<e;c++) { if(c>e-a-b) break; //与11行同理 for(d=1;d<e;d++) { if(d>e-a-b-c) break; //与11行同理 if(a+b+c+d==e) sum++; //符合条件sum+1 } } } } printf("%d\n",sum); } int main() { int t,i; scanf("%d",&t); for(i=0;i<t;i++) f(); //调用t次函数 return 0; }
代码输完以后发现样式答案都对,但一提交就提示超时。
所以这道题需要考研我们的算法,需要我们 找 规 律。
5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
4 | 10 | 20 | 35 | 56 | 84 | 120 | 165 | 220 | 286 |
列出e取5~14的输出
发现
5*6*7=35*6 |
6*7*8=56*6 |
7*8*9=84*6 |
8*9*10=120*6 |
因此得到规律:满足条件的对数 =(e-1) * (e-2) * (e-3) / 6
注意事项: 细心就会找到规律,细心观察
参考代码:
#include <stdio.h> int main() { int e,t,i; scanf("%d",&t); for(i=0;i<t;i++) //程序循环t次 { scanf("%d",&e); printf("%d\n",(e-1)*(e-2)*(e-3)/6); //利用规律得到符合条件的对数并输出 } return 0; }
为满足同学做题,特整理出此题解。@LLS
0.0分
6 人评分
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:586 |
不知道哪里错了浏览:1141 |
【回文数(二)】 (C++代码)浏览:866 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:451 |
母牛的故事 (C语言代码)浏览:435 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:840 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:561 |
蓝桥杯历届试题-翻硬币 (C++代码)浏览:873 |
复数求和 (C语言代码)浏览:920 |
理财计划 (C语言代码)浏览:467 |