1.把1至2009这2009个自然数依次写下来得到一个多位数123456789.....2009,这个多位数除以9余数是多少?
代码
1
class
Program
2
{
3
static
void
Main(
string
[] args)
4
{
5
int
number
=
0
;
6
ArrayList stringArray
=
new
ArrayList () ;
7
string
numberstring
=
string
.Empty ;
8
for
(
int
i
=
1
; i
<=
2009
; i
++
)
9
{
//
将数字头尾相接连成字符串
10
numberstring
=
numberstring
+
i.ToString();
11
}
12
//
将字符串分割成字符数组
13
char
[] charArray
=
numberstring.ToCharArray();
14
foreach
(
char
charnumber
in
charArray)
15
{
16
//
为了使用Convert.ToInt32方法,将字符数组中每个字符转成字符串类型
17
stringArray.Add(charnumber.ToString());
18
}
19
foreach
(
string
stringnumber
in
stringArray)
20
{
//
将数字的每一位的数字相加
21
number
=
number
+
Convert.ToInt32(stringnumber);
22
}
23
//
数字的每一位的数字相加后的总数除9和原数字除9,余数相等
24
Console.WriteLine(number
%
9
);
25
}
26
}
参考《有余数的除法》
对于任意一个整数除以一个自然数,一定存在唯一确定的商和余数,使被除数=除数×商+余数(0≤余数<除数)。也就是说,整数a除以自然数b,一定存在唯一确定的q和r,使a=bq+r(0≤r<b)成立. 我们把对于已知整数a和自然数b,求q和r,使a=bq+r(0≤r<b)成立的运算叫做有余数的除法,或称带余除法.记为a÷b=q(余r)或a÷b=q…r 读作“a除以b商q余r”,其中a叫做被除数,b叫做除数,q叫做不完全商(简称商),r叫做余数.
例如5÷7=0(余5),6÷6=1(余0),29÷5=5(余4).
解决有关带余问题时常用到以下结论:
(1)被除数与余数的差能被除数整除.即如果a÷b=q(余r),那么b|(a-r).
因为a÷b=q(余r),有a=bq+r,从而a-r=bq,
所以b|(a-r).
例如39÷5=7(余4),有39=5×7+4,从而39-4=5×7,所以5|(39-4)
(2)两个数分别除以某一自然数,如果所得的余数相等,那么这两个数的差一定能被这个自然数整除.即如果a1÷b=q1(余r),a2÷b=q2(余r),那么b|(a1-a2),其中a1≥a2.
因为a1÷b=q1(余r),a2÷b=q2(余r),有a1=bq1+r,a2=bq2+r,从而a1-a2=(bql+r)-(bq2+r)=b(q1-q2),所以b|(a1-a2).
例如,22÷3=7(余1),28÷3=9(余1),有22=3×7+1,28=3×9+1,从而28-22=3×9-3×7=3×(9-7),所以3|(28-22).
(3)如果两个数a1和a2除以同一个自然数b所得的余数分别为r1和r2,r1与r2的和除以b的余数是r,那么这两个数a1与a2的和除以b的余数也是r.
例如,18除以5的余数是3,24除以5的余数是4,那么(18+24)除以5的余数一定等于(3+4)除以5的余数(余2).
(4)被除数和除数同时扩大(或缩小)相同的倍数,商不变,余数的也随着扩大(或缩小)相同的倍数.即如果a÷b=q(余r),那么(am)÷(bm)=q(余rm),(a÷m))÷(b÷m)=q(余r÷m)(其中m|a,m|b).
例如,14÷6=2(余2),那么(14×8)÷(6×8)=2(余2×8),(14÷2)÷(6÷2)=2(余2÷2).
下面讨论有关带余除法的问题.
例1 节日的街上挂起了一串串的彩灯,从第一盏开始,按照5盏红灯,4盏黄灯,3盏绿灯,2盏蓝灯的顺序重复地排下去,问第1996盏灯是什么颜色?
分析:因为彩灯是按照5盏红灯,4盏黄灯,3盏绿灯,2盏蓝灯的顺序重复地排下去,要求第1996盏灯是什么颜色,只要用1996除以5+4+3+2的余数是几,就可判断第1996盏灯是什么颜色了.
解:1996÷(5+4+3+2)=142…4
所以第1996盏灯是红色.
例2 把1至1996这1996个自然数依次写下来,得一多位数123456789101112……199419951996,试求这一多位数除以9的余数.
分析:从前面我们学习被9整除的特征知道,一个数的各个数位上的数字之和能被9整除,这个数必能被9整除.所以一个数除以9的余数,与这个数的各个数位上的数字之和除以9的余数正好相等.这样问题转化为求1至1996这1996个自然数中所有数字之和是多少,然后用这个和除以9所得的余数即为所求.
解:将0至1999这2000个整数一头一尾分成如下1000组:(0,1999),(l,1998),(2,1997),(3,1996),……,(997,1002),(998,1001),(999,1000).以上每一组的两数之和都是1999,并且每一组两数相加时都不进位,这样1至1999这1999个自然数的所有数字之和等于:
(1+9+9+9)×1000=28000
而1997至1999这3个自然数所有数字之和为:
1×3+9×3+9×3+7+8+9=81
所以从1至1996这1996个自然所有数字之和为:
28000-81=27919
27919÷9=3102…1
所以123456789……199419951996除以9的余数是1.
另外:因为依次写出的任意连续9个自然数所组成的位数一定能被9整除.而1至1996共有1996个连续的自然数,且1996÷9=221…7,最后7个自然数为1990,1991,1992,…1996,这7个数的所有数字之和为:
1×7+9×7+9×7+1+2+3+…+6=154
154÷9=17…1
所以123456789……199419951996这个多位数被9除余1.
为什么依次写出任意连续9个自然数所组成的多位数一定能被9整除呢?这是因为任意连续的9个自然数各数位上的数字之和除以9的余数,必是0,1,2,…,7,8这9个数,而各数位上的数字之和除以9的余数,就等于这9个数之和0+1+2+…+8除以9的余数,由于0+1+2+…+8=36能被9整除,所以任意连续的9个自然数各数位上的数字之和必能被9整除,因此任意连续9个自然数所组成的多位数必能被9整除.
2.魔术矩阵:一个n*n的矩阵,其中n必须为奇数,将1至n2的整数放入矩阵,使矩阵各列各行以及对角线的元素值总和均相同
魔术矩阵
1
using
System;
2
3
namespace
ConsoleTest
4
{
5
class
MagicM
6
{
7
int
[,] mm;
8
static
void
Main(
string
[] args)
9
{
10
do
11
{
12
MagicM myClass1
=
new
MagicM();
13
int
n;
14
Console.WriteLine(
"
请输入矩阵大小:
"
);
15
n
=
int
.Parse(Console.ReadLine());
16
if
(n
==
0
)
17
{
18
Console.WriteLine(
"
请按Enter离开
"
);
19
break
;
20
}
21
if
(n
%
2
==
0
)
22
{
23
Console.WriteLine(
"
请输入奇数:
"
);
24
continue
;
25
}
26
myClass1.mm
=
new
int
[n, n];
27
myClass1.AssingValue(n);
28
myClass1.PrintOut(n);
29
Console.WriteLine(
"
\n
"
);
30
}
while
(
true
);
31
Console.ReadLine();
32
}
33
34
void
AssingValue(
int
n)
35
{
36
int
assingValue
=
1
;
//
将要填入的值
37
int
p
=
n
-
1
;
//
row,column边界值
38
int
column
=
p
/
2
;
//
中间点的位置
39
int
row
=
0
;
40
//
初始化mm数组
41
for
(
int
i
=
0
; i
<
n; i
++
)
42
{
43
for
(
int
j
=
0
; j
<
n; j
++
)
44
{ mm[i, j]
=
0
; }
45
}
46
//
“1”一律放在第一行中间位置
47
mm[row, column]
=
assingValue;
48
do
49
{
50
assingValue
++
;
51
column
--
;
52
row
--
;
53
//
第二个数放在前一个数的左上角。
54
//
如果行超出范围,就放到同一列的最后。
55
//
如果列超出范围,就放到同一行的最后。
56
//
如果行和列同时超出范围或左上角已有数字,则放在正下方
57
if
(column
<
0
&
row
<
0
)
58
{
59
row
+=
2
;
60
column
+=
1
;
61
}
62
else
63
{
64
if
(column
<
0
)column
=
p;
65
if
(row
<
0
) row
=
p;
66
}
67
if
(mm[row, column]
!=
0
)
68
{
69
column
+=
1
;
70
row
+=
2
;
71
}
72
mm[row, column]
=
assingValue;
73
}
while
(assingValue
<
n
*
n);
74
}
75
void
PrintOut(
int
n)
76
{
77
for
(
int
i
=
0
; i
<
n; i
++
)
78
{
79
Console.WriteLine();
80
for
(
int
j
=
0
; j
<
n; j
++
)
81
{ Console.Write(mm[i, j]
+
"
\t
"
); }
82
}
83
}
84
}
85
}
86
3.递归:递归的效率比循环高
反转字符串
class
ReverseWord
{
static
void
Main(
string
[] args)
{
string
strResult;
ReverseWord myURec
=
new
ReverseWord();
strResult
=
myURec.DoStrRev(
"
This is a teststring
"
);
Console.WriteLine(
"
反转后输出为{0}
"
,strResult );
Console.ReadLine();
}
string
DoStrRev(
string
strTest)
{
if
(strTest.Length
==
1
)
return
strTest;
string
strResult
=
strTest.Substring (strTest .Length
-
1
,
1
);
strResult
+=
DoStrRev (strTest.Substring (
0
,strTest.Length
-
1
));
return
strResult ;
}
}
阶乘运算
class
UsingRecursive
{
static
void
Main(
string
[] args)
{
int
intResult;
UsingRecursive myURec
=
new
UsingRecursive();
intResult
=
myURec.DoFactorial(
10
);
Console.WriteLine(
"
10的阶乘等于{0}
"
,intResult);
}
int
DoFactorial(
int
p)
{
int
result
=
0
;
if
(p
==
1
)
return
1
;
result
=
DoFactorial(p
-
1
)
*
p;
return
result;
}
}