一天一道算法题--6.9--数学题
感谢微信平台----一天一道算法题---------每天多一点进步----
今天 刚刚又玩了2盘 LOL 把我的时间全给弄光了.....
因为 晚上 可能开始写课程设计了 抓紧时间 写了今天的
关于那个 stack的 感觉超出我预期想象了 得压几天了 哎..
problem:
求和为指定数字的连续正整数序列
for example:
Sn = 100时
18 19 20 21 22
9 10 11 12 13 14 15 16
analyse:
有事 先撤.....
刚刚头太痛 眼睛太酸了 应该是每晚太晚睡了.... 白天 又要早起 早自习 虽然 经常一睡就到9点了.....
好 回到这题
晓爷 说我英语他渣 怎么过6J 所以 我决定 今天 代码的注释 都用 英文来实现.... 为6J准备...
这题的关键是 把握住 等差数列求和的转换 注意到可以转换成一次线性方程
好 我下面上demo....
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // give a sum and n 2 // so the arr is from 1 to n 3 // sum = n*(a1+an)/2 = na1 + n*(n-1) / 2; 4 // so a1 = ( sum - n(n-1)/2 )/n 5 6 #include <iostream> 7 using namespace std; 8 9 void slove( int sum , int n ) 10 { 11 int i , value , cnt , first; 12 if( sum<=0 || n<=0 ) 13 return; 14 cnt = 0; 15 i = 1; 16 value = sum - i*(i-1)/2; 17 while( value>=i ) // because a1 = ( sum - n*(n-1)/2 ) /n if this can be worked the value must >= n and because the element must >=1 you know the arr is from 1 to n 18 { 19 if( value%i==0 ) // the element is integer 20 { 21 first = value/i; 22 printf( "the %d arr: ",cnt+1 ); 23 for( int j = first ; j<first+i ; j++ ) 24 { 25 printf( "%d\t",j ); 26 } 27 printf( "\n" ); 28 } 29 i++; 30 cnt++; 31 value = sum - i*(i-1)/2; 32 } 33 printf( "cnt: %d\n",cnt ); 34 } 35 36 int main() 37 { 38 int sum , n; 39 while( ~scanf("%d %d",&sum,&n) ) 40 { 41 slove( sum , n ); 42 getchar(); 43 } 44 return 0; 45 }
因为 已经是第二天了 那就顺便给出今日的一句话 或是 一段话
today:
you are the apple of my eye.
经历过你对我的喜欢,我就会觉得别人对我的喜欢,没法和你相比。被你喜欢过,很难觉得别人有那么喜欢我。
i miss you
bye bye
just follow your heart