[关闭]
@Moritz 2019-03-29T08:19:55.000000Z 字数 1108 阅读 443

P1008 三连击 级数求和

洛谷 C++ 所有文稿


共9个数分成3组,分别组成3个三位数,且使这3个三位数构成的比例,试求出所有满足条件的3个三位数。

比较入门的一道算法题,写出来是因为有一个小坑没有注意到

  1. #include <iostream>
  2. #include <cmath>
  3. #include <set>
  4. using namespace std;
  5. int n_i(int x,int y,int z){
  6. return x*100+y*10+z;
  7. }
  8. void divide(int &x,int &y,int &z,int sum){
  9. x=sum/100;
  10. y=sum/10-x*10;
  11. z=sum%10;
  12. }
  13. int a[3];
  14. bool en=false;
  15. void solve(int cur){
  16. if(cur>=3){
  17. int sum=n_i(a[0],a[1],a[2]);
  18. int sum2=sum*2,sum3=sum*3;
  19. if(sum3>999) return;
  20. int b[6];
  21. set<int> cnt;
  22. cnt.insert(a[0]);
  23. cnt.insert(a[1]);
  24. cnt.insert(a[2]);
  25. divide(b[0],b[1],b[2],sum2);
  26. divide(b[3],b[4],b[5],sum3);
  27. for(int x=0;x<6;x++){
  28. if (cnt.count(b[x])||!b[x]) return;//注意!会出现相乘得出来0
  29. else cnt.insert(b[x]);
  30. }
  31. if(en) cout<<endl;
  32. else en=true;
  33. cout<<sum<<" "<<sum2<<" "<<sum3;
  34. return;
  35. }
  36. if (!cur){
  37. for(int i=1;i<=3;i++){
  38. a[cur]=i;
  39. solve(1);
  40. }
  41. }
  42. else{
  43. for(int i=1;i<=9;i++){
  44. bool ok=true;
  45. for(int j=0;j<cur;j++){
  46. if (a[j]==i){
  47. ok=false;break;
  48. }
  49. }
  50. if (ok){
  51. a[cur]=i;
  52. solve(cur+1);
  53. }
  54. }
  55. }
  56. }
  57. int main(){
  58. solve(0);
  59. return 0;
  60. }

级数求和要注意精度,一开始用float精度不足,导致两个WA

  1. #include <iostream>
  2. #include <cmath>
  3. #include <set>
  4. using namespace std;
  5. int main(){
  6. int k;
  7. cin>>k;
  8. double sum=0.0;//注意 要用双精度
  9. for(int i=1;;i++){
  10. sum+=1.0/i;
  11. if(sum>k){
  12. cout<<i;
  13. break;
  14. }
  15. }
  16. return 0;
  17. }

2019.3.25

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注