輸出n以內被7或17整除的數
阿新 • • 發佈:2021-01-06
- 通過遍歷如果能被7或17整除,並且是偶數就輸出這個數,這樣要遍歷range次
int methodOne(int range){
int i,m=0,s=0;
for(i=1;i<=range;i++){
if((i%7==0 || i%17==0) && i%2==0){
s=s+i;
}
}
printf("sum1=%d\n",s);
}
- 因為輸出的都是偶數,所以可以使步長+2,這樣只需要遍歷range/2次。
- 注意:i的初始值為0,這樣i的變化才是0、2、4、6...遞增才是偶數
int methodOne(int range){
int i,s=0;
for(i=0;i<=range;i+=2){
if((i%7==0 || i%17==0)){
s=s+i;
}
}
printf("sum1=%d\n",s);
}
- 能被7整除的偶數有:14、28、42、56
- 能被17整除的偶數有:34、68、102、170
- 能被17整除的偶數與能被7整除的偶數相差20、40、80、100...
- 能被7整除的偶數的步長是14
- 因為存在既能被7整除也能被17整除這樣的數(如:238),所以只能加一次這樣的數。前面已經能被7整除的數加了一次,後面就不能被7整除。因為能17整除的偶數增長快,所以它的最大值不能大於range。
int methodTwo(int range){
int sum=0,j=14,m;
for(m=1;j<=range;j+=14,m++){
sum=sum+j;
if(j+20*m<range && (j+20*m)%7!=0){
sum=sum+j+20*m;
}
}
printf("sum2=%d\n",sum);
}
- 能被7整除的偶數有:14、28、42、56...14n, 前n項和S1=[n/14 * (14+n/14 * 14)]/2
- 能被17整除的偶數有:34、68、102、170...34n, 前n項和S2
- 能被17整除的偶數與能被7整除的偶數有:238...238n, 前n項和S3=[(n/238 * (238+n/238 * 238)]/2;
- 因為加了兩次能被17整除的偶數與能被7整除的偶數,所以要減一次S3
int methodThree(int n){
int sum1, sum2, sum3;
sum1=(n/14 * (14+n/14 * 14))/2;
sum2=(n/34 * (34+n/34 * 34))/2;
sum3=(n/238 * (238+n/238 * 238))/2;
return sum1+sum2-sum3;
}