根據:能被3整除的數其各位的總和也能被3整除的原則,個位6能被3整除,所以就只用考慮高位4位,在這裡就可以采用如下方法獲得最終結果
1 /*================================== 2 Copyright (C) 2014 All rights reserved. 3 FileName:3.c 4 author:donald 5 date:2014/08/16/ 23:35:55 6 ===================================*/ 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <string.h> 10 11 int main(int argc, const char *argv[]) 12 { 13 int index,cnt ; 14 for(index = 1000;index < 9999;index ++){ 15 if(index % 3 == 0){ 16 cnt ++; 17 printf("%8d",index*10 + 6) ; 18 } 19 } 20 printf("\nresult is %d \n",cnt); 21 return 0; 22 }
12504個
解法一)
首先把所求的五位數分成兩類:
【1】萬位數字為6者,且能被3整除的五位數皆合乎所求
(9999-0000)÷3+1=3334
【2】萬位數字不為6者,且能被3整除的五位數
(1)個位數字為6:
[(9999-1002)÷3+1]-[(999-000)÷3+1]=2666
十位數字為6,百位數字為6,千個位數字為6:皆為2666
(2)個、十位數字為6:
[(999-102)÷3+1]-[(99-00)÷3+1]=266
個、百位數字為6,個、千位數字為6,十、百位數字為6,十、千位數字為6,千、百位數字為6:皆為266
(3)個、十、百位數字為6:
[(99-12)÷3+1]-[(9-0)÷3+1]=26
個、十、千位數字為6,個、百、千位數字為6,十、百、千位數字為6:皆為26
(4)個、十、百、千位數字為6:
36666、96666,共2個
2666×4-266×6+26×4-2=9170
故合乎所求的五位數共有3334+9170=12504
解法二)
全部五位數中3的倍數共(99999-9999)/3=30000個
1,4,7為3k+1,以1表示
2,5,8為3k+2,以2表示
0,3,9為3k,以0表示
不含6且為3的倍數有以下7類
(1)00000,共3^5-3^4=162
(2)11100,共[5!/(3!*2!)]*3^5-(4!/3!)*3^4=2106
(3)12000,共(5!/3!)*3^5-(4!/2!)*3^4=3888
(4)11112,共(5!/4!)*3^5=1215
(5)11220,共[5!/(2!*2!)]*3^5-[4!/(2!*2!)]*3^4=6804
(6)22200,共[5!/(3!*2!)]*3^5-(4!/3!)*3^4=2106
(7)12222,共(5!/4!)*3^5=1215
(1)~(7)共17496個
30000-17496=12504
其實沒有必要算k的值,因為只要輸出個數即可的話,那麼末尾為6是肯定的。那麼只需要判斷從1000到9999的前四位數能被3整除的有多少個就OK了。6可以被3整除的,那麼就計算前面四位數,把4位數字相加如果能被3整除哪麼就滿足條件。
main()
{
int i,j,k,m,count;
m=0;
for(i=1000;i<=9999;i++)
{k=10*i+6;//其實沒什麼用
for(j=i;j<=0;j++){//將4位數字相加
m+=j%10;
}
if((m+6)%3==0 count++;
}
printf("%d",count);
}