加法變乘法——第六屆藍橋杯C語言B組(省賽)第六題
阿新 • • 發佈:2018-05-15
clu 自己 nbsp 加法 藍橋杯 重新 () std spa
原創
加法變乘法
我們都知道:1+2+3+ ... + 49 = 1225
現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。
請你尋找另外一個可能的答案,並把位置靠前的那個乘號左邊的數字提交(對於示例,就是提交10)。
註意:需要你提交的是一個整數,不要填寫任何多余的內容。
此題思路很簡單,有48個‘+’號,題目要求將其中兩個不相鄰的 ‘+’ 號變成 ‘*’ 號後式子得出的結果是2015.
從第1個 ‘+’ 號開始遍歷,依次將第1~46個 ‘+’ 號變成 ‘*’ 號,定位好第一個 ‘+’ 號後,定位第二個 ‘+’ 號,
即從第一個 ‘+’ 號後定位第二個 ‘+’ 號(註意第一個 ‘+’ 號前面不能是 10 )。定位好兩個 ‘+’ 號後判斷式
子值是否等於2015,等於跳出循環,否則繼續循環。
#include<stdio.h> int main() { int i; int s1=0; int s2=0; int total=0; int j; for(i=1;i<=46;i++) //i,j值不能變 { if(i==10) continue; s1=i*(i+1); //第一個*值 for(j=i+2;j<=48;j++) { s2=j*(j+1); //第二個*值 int vari; for(vari=1;vari<=49;vari++) { if( vari!=i && vari!=i+1 && vari!=j && vari!=j+1 ) total=total+vari; } total=total+s1+s2; if(total==2015) { printf("%d",i); return 0; } else { total=0; continue; } } } printf("%d",i); return 0; }
後段代碼思路是相同的,是自己後面復習重新敲的。
#include<stdio.h> int flag=0; int ff=0; int main(){ int i=0; int j=0; //j代表第一個*前面的數字 int z=0; //z代表第二個*前面的數字 int total=0; for(j=1;j<=46;j++){ //定位第一個* if(j==10){ continue; } for(i=1;i<=49;i++){ if(i==j){ //定位好第一個* total+=i*(i+1); int i_t=0; while(i_t!=i+2){ i_t++; } int total_=total; //備份第一階段的總值 int i_tt=i_t; //備份第一階段的後值 for(z=j+2;z<=48;z++){ //定位好第二個* for(i_t=i_tt;i_t<=49;i_t++){ if(i_t==z){ total+=i_t*(i_t+1); i_t++; } else{ total+=i_t; } } if(total==2015){ printf("%d",j); flag=1; break; } else{ total=total_; } } ff=1; } else{ total+=i; } if(flag==1){ break; } if(ff==1){ total=0; ff=0; break; } } if(flag==1){ break; } } return 0; }
答案:16
13:25:54
2018-05-15
加法變乘法——第六屆藍橋杯C語言B組(省賽)第六題