趣味题编程

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,一定存在唯一确定的qr,使a=bqr0rb)成立.  我们把对于已知整数a和自然数b,求qr,使a=bqr0rb)成立的运算叫做有余数的除法,或称带余除法.记为a÷b=q(余r)或a÷b=qr  读作“a除以bqr”,其中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=bqr,从而a-r=bq

  所以b|(a-r).

  例如39÷5=7(余4),有395×74,从而39-4=5×7,所以5|(39-4

  (2)两个数分别除以某一自然数,如果所得的余数相等,那么这两个数的差一定能被这个自然数整除.即如果a1÷b=q1(余r),a2÷b=q2(余r),那么b|(a1-a2),其中a1a2

  因为a1÷b=q1(余r),a2÷b=q2(r),有a1=bq1+ra2=bq2r,从而a1-a2=bqlr-bq2r=bq1-q2),所以b(a1-a2)

  例如,22÷3=7(余1),28÷3=9(余1),有22=3×7128=3×91,从而28-22=3×9-3×73×(9-7),所以3|(28-22).

  (3)如果两个数a1a2除以同一个自然数b所得的余数分别为r1r2r1r2的和除以b的余数是r,那么这两个数a1a2的和除以b的余数也是r

  例如,18除以5的余数是324除以5的余数是4,那么(18+24)除以5的余数一定等于(34)除以5的余数(余2).

  (4)被除数和除数同时扩大(或缩小)相同的倍数,商不变,余数的也随着扩大(或缩小)相同的倍数.即如果a÷b=q(余r),那么(am)÷(bm=q(余rm),(a÷m))÷(b÷m=q(余r÷m)(其中mamb).

  例如,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除以5432的余数是几,就可判断第1996盏灯是什么颜色了.

解:1996÷(5432=1424

  所以第1996盏灯是红色.

2 119961996个自然数依次写下来,得一多位数123456789101112……199419951996,试求这一多位数除以9的余数.

分析:从前面我们学习被9整除的特征知道,一个数的各个数位上的数字之和能被9整除,这个数必能被9整除.所以一个数除以9的余数,与这个数的各个数位上的数字之和除以9的余数正好相等.这样问题转化为求119961996个自然数中所有数字之和是多少,然后用这个和除以9所得的余数即为所求.

解:019992000个整数一头一尾分成如下1000组:(01999),(l1998),(21997),(31996),……,(9971002),(9981001),(9991000).以上每一组的两数之和都是1999,并且每一组两数相加时都不进位,这样119991999个自然数的所有数字之和等于:

  (199+9)×1000=28000

  而199719993个自然数所有数字之和为:

  1×3+9×3+9×37+8+9=81

  所以从119961996个自然所有数字之和为:

  28000-81=27919

  27919÷9=31021

  所以123456789……199419951996除以9的余数是1

  另外:因为依次写出的任意连续9个自然数所组成的位数一定能被9整除.而11996共有1996个连续的自然数,且1996÷9=2217,最后7个自然数为199019911992,…1996,这7个数的所有数字之和为:

  1×79×7+9×7+123+…+6=154

  154÷9=171

  所以123456789……199419951996这个多位数被9除余1

  为什么依次写出任意连续9个自然数所组成的多位数一定能被9整除呢?这是因为任意连续的9个自然数各数位上的数字之和除以9的余数,必是012,…,789个数,而各数位上的数字之和除以9的余数,就等于这9个数之和0+1+2++8除以9的余数,由于012+…+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;
        }
            
    }

 

 

你可能感兴趣的:(编程)