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的整数放入矩阵,使矩阵各列各行以及对角线的元素值总和均相同
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.递归:递归的效率比循环高
{
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 ;
}
}
{
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;
}
}