解题思路: 我们看到这道题首先想到的肯定是用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 人评分
循环入门练习5 (C语言代码)浏览:829 |
剪刀石头布 (C语言代码)浏览:1432 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:527 |
数列问题 (C语言代码)浏览:1019 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:501 |
【亲和数】 (C语言代码)浏览:688 |
Manchester-字符逆序(稳,附带小问题)浏览:5028 |
开门人和关门人浏览:1125 |
题目:前2位数的和是第3位数 比如1 2 3 5 8 13 21 34 55 等,当你输入1时,出现1 输入9时,出现55 各位大神,如有简便方法,可以留浏览:266 |
1277题解浏览:566 |