1. 程式人生 > >c#程式設計習題僅供參考(自己寫的僅供參考)

c#程式設計習題僅供參考(自己寫的僅供參考)

1,編一個程式,輸入一個正數,對該數進行四捨五入到個位數的運算。例如,實數12.56經過四捨五入運算,得到結果13;而12.46經過四捨五入運算,得到結果12。

1.Console.WriteLine("請輸入一個正數");
2.double i=Convert.ToDouble(Console.ReadLine());//或者 double i=double.Parse(Console.ReadLine());
3.int e=(int)i;//將double型別強制轉化為int型別
4.if(i-e>=0.5)  
5.{
6.    i=e+1;
7.}
8.else
9.{
10.   i=e;
11.}
12.Console.WriteLine(i);

解題思路:判斷正數十分位上的數是否>=5,如果成立,則該正數加1,然後捨去小數位;不成立,則直接捨去小數位,然後輸出;要注意的兩個點:1.將輸入的值接收為double型別 有兩種方法:Convernt.ToDouble()或者double.Parse();2.強制型別轉換 將double型別的值i強制轉換為int型  只需在i前面新增(int);要注意:int型別佔4個位元組(32位)(1位元組=8位  1byte=8bit),  double 型別佔8個位元組(64位),int值(低精度整數型)轉化為double型別(高精度浮點型)不會丟失精度,但是double型別高精度轉化為低精度是會丟失精度的。

還有一種思路,大同小異:得到這個正數的十分位,判斷其是否大於等於5,(這種思路寫的稍稍複雜了點,不夠精煉,沒錯,這就是我自己想的)程式碼如下:

1.Console.WriteLine("請輸入一個正數");
2.double i=Convert.ToDouble(Console.ReadLine());
3.int j=(int)(i*10%10);//注意:這裡強制
4.if(j>=5)
5.{
6.    i=(int)i+1;
7.}
8.else
9.{
10.    i=(int)i;
11.}
12.Console.WriteLine(i);

2,編一個程式,用while迴圈語句來計算1+1/2+2/3+3/4+...+99/100之和。

1.double i=0,sum=0;
2.while(i<100)
3.{
4.    if(i==0)
5.    {
6.        sum=1;
7.    }
8.    else
9.    {
10.        sum+=i/(i+1);
11.    }
12.    i++;
13.}       
14.Console.WriteLine(sum);

上面的程式碼是我自己寫的,其實可以更精簡一點。程式碼如下:

1.double i=1,sum=1;
2.while(i<100)
3.{
4.    sum+=i/(i+1)
5.    i++;
6.}
7.Console.WriteLine(sum);

ps:注意i和sum的值要定義為double型,如果定義為int型,會導致得不到準確的結果(定義為double時sum=95.8126224823603   定義為int時sum=1 因為定義為int時 除了第一項為1,其餘得到的都為0)

3.編一個程式,打印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數本身。例如, 153=111+555+333,所以153是“水仙花數”

 for (int i = 100; i < 1000; i++)
            {
                if (Math.Pow(i % 10, 3) + Math.Pow(i / 10 % 10, 3) + Math.Pow(i / 100, 3) == i)//Math.Pow(double x,double y)返回x的y次冪
                {
                    Console.WriteLine(i);
                }
            }

ps:這個可以用while或者for迴圈都可以,思路都是得到一個三位數上的各個數字,每個數字的3次冪的和等於這個數則輸出這個數。要知道Math.Pow(double x,double y)(得到數字x的y次冪)這個方法。

下面是使用while的兩種寫法:

int i = 100;
while (i < 1000)
{
    int a = i % 10;           //取個位        
    int b = i % 100 / 10;     //取十位
    int c = i / 100;          //取百位
    if (i == Math.Pow(a, 3) + Math.Pow(b, 3) + Math.Pow(c, 3)) 
    {
        Console.WriteLine(i);   //這裡使用了while..do..的寫法
    }
    i++;
}
int i = 100;
do
{
    int a = i % 10;         //取個位
    int b = i / 10 % 10;    //取十位
    int c = i / 100;        //取百位
    if (i == Math.Pow(a, 3) + Math.Pow(b, 3) + Math.Pow(c, 3))
    {
        Console.WriteLine(i);       //這裡使用了do..while..的寫法
    }

    i++;
} while (i < 1000);

ps:其中取三位數的十位數:既可以寫成i/10%10,也可以寫成i%100/10,都可以,至於使用while..do..還是do..while..看個人喜好

4.編寫一個程式,用while語句,求出1+(1+2)+(1+2+3)+...+(1+2+3+...+10)之和。  

int i = 1, sum1 = 0, sum2 = 0;
while (i < 11)
{
    for (int j = 1; j <= i; j++)
    {
        sum1 += j;

    }
    sum2 += sum1;
    sum1 = 0;     //這裡一定要注意將sum1的值清0,否則程式會累加之前sum1的值,得到的總和是錯誤的
    i++;
}
Console.WriteLine(sum2);

.ps:這裡我用了在while語句裡插入了一個for迴圈,這裡要注意的是在總和計算後,清零了之前的sum1的值,不然會累加之前sum1的值(這個錯誤不該犯的,不過打個斷點,很容易就看出哪裡出問題了);

int i = 1, j = 1, S0 = 0, S1 = 0;
while (j < 11)
{
    while (i <= j)
    {
        S0 += i;
        i++;
    }
    S1 += S0;
    j++;
}
Console.WriteLine(S1);

ps:用上述這個while迴圈的方法更巧妙,我的方法的思路笨了些。我是把每一項都求和,然後逐個加起來,但是這個方法寫的時候就需要一次將第一種寫法中的sum1迴圈一次就清零,不然會累加的,得出錯誤的結果。其實可以發現下一項是前一項的和再加上第i項(i為從1開始計數)即可。所以更推薦不用清零的寫法。其實不用清零並且只需要三個變數還可以有另外一種寫法:

int sum = 0;
for (int i = 1; i < 11; i++)
{
    for (int j = 1; j <= i; j++)
    {
        sum += j;
    }
}
Console.WriteLine(sum);

這另外說一下,如果按照最上面的第一種寫法,不清零得出的結果是715,我推測了下715=220*3+55;55是最後一項的值,正確程式最後得出的值為220,所以我推測系統應該是多算了2遍總值再加上最後一個尾項;(這個我就沒有仔細求證,有耐心的同學可以自己思索一下 ,當然,我以後也會找時間填這個坑)

Console.WriteLine("請輸入兩個整數");
int a = int.Parse(Console.ReadLine());       //將輸入的值轉化為int值 可以用int.Parse()或者Convert.ToInt32()
int b = Convert.ToInt32(Console.ReadLine());
bool CarryOn = true;                  
while (CarryOn) 
{
    if (a < b)                              //這裡先比較兩個數的大小 然後輾轉相除
    {
        int temp = a;
        a = b;
        b = temp;
    }
    if (a != 0 && b != 0 && a % b != 0)    
    {
        a = a % b;
        b = b % a;
    }
    else
    {
        //if (b == 0)
        //{
        //    Console.WriteLine(a);
        //}
        //else
        //{
        //    Console.WriteLine(b);
        //}
        int c = b == 0 ? a : b;            //這裡有兩種寫法 一種直接輸出a或b 另外一種可以用三元運算子
        Console.WriteLine(c);
        CarryOn = false;
    }

ps:其實也有一種其中有一個為0的情況也要考慮到,這個只需要稍加完善即可;還有一種思路(就是取兩個數中較小的數,然後一直取餘這個數,隨著這個數的自減,最終得出這兩個數的最大公約數)寫起來也是可以的,但是執行效率可能沒有輾轉相除法(具體可百度或維基百科)求最大公因數來的快。不過程式碼量倒很簡潔;

Console.WriteLine("請輸入兩個整數");
int a = int.Parse(Console.ReadLine());
int b = Convert.ToInt32(Console.ReadLine());
int k = a > b ? b : a;                //取兩個數較小的那個數
while (!(a % k == 0 && b % k == 0);    //如果兩個數不能同時整除這個數就一直繼續下去  直到找到兩個數的最大公因數
{
    k--;               
}
Console.WriteLine(k);

ps:其他一些方法求最大公因數(;例如輾轉相減等等),也可以寫出對應的程式

6.有關係式11+22+33+...+kk<2000,編一個程式,求出滿足此關係式的k的最大值。

int i = 1, sum = 0;
while (sum < 2000)
{
    //sum += i * 10 + i;
    sum += i * i;
    i++;
}
Console.WriteLine(i-2);

ps:這道題沒什麼好說的,不過題目的意思不是很明確,平常來看每一項的規律是i*10+10,但是答案給出的規律是i*i;上面兩種情況都寫出來了。但是尤其要注意的是最後的出i的結果要減去2.,因為程式是在得到大於2000的值之後又將i自增了一次。所以要減2;

7.編一個程式,利用while迴圈語句,找出2到100之間的素數。

int i = 2;
while (i < 101)
{
    int j = i - 1;
    bool prime = true;
    while (j != 1)
    {
        if (i % j == 0)
        {
            prime = false;
            break;
        }
        j--;
    }
    if (prime == true)
    {
        Console.WriteLine(i);                
    }
    i++;
}

ps:這道題的主要思路就是首先一個while將範圍定義在100以內。然後素數的定義:素數又稱質數,有無限個。質數定位為在大於1的自然數中,除了1和它本身以外不再有其他因數。然後定義另外一個變數j,用i依次用這些j求餘。如果其中有出現取餘為0的情況,那麼這個數就不是素數,然後用一個bool值來標記這個數,如果是素數則為true,否則為false。然後使用break進入下個迴圈。

int i = 2, j;
bool b;
while (i < 100)
{
    b = true;
    j = 2;
    while (j <= i - 1)
    {
        if (i % j == 0)
        {
            b = false;
            break;
        }
        j++;
    }
    if (b == true)
    {
        Console.WriteLine(i);
    }
    i++;
}

ps:這是另外一種寫法,其實思路是一樣的,不過一個是將j的值逐漸往上遞增,一個是逐漸往下遞減。

8,編一個程式,用while迴圈語句實現下列功能:有一籃雞蛋,不止一個,有人兩個兩個數,多餘一個,三個三個數,多餘一個,再四個四個地數,也多餘一個,請問這籃雞蛋至少有多少個。  

int i = 1;
bool carryon=true;
while (carryon)
{
    if (i % 2 == 1 && i % 3 == 1 && i % 4 == 1&&i!=1)
    {
        Console.WriteLine(i);
        break;
    }
    i++;
}

這道題很簡答,但是也有陷阱。首先說明不止一個,所以不可能是1.我用的方法是從1開始找。找到之後將迴圈停止,然後跳出整個迴圈即可

還有別人寫的參考也貼出來吧(可以參考參考):

int num = 2;
while (num < 10000)
{
    if (num % 3 == 1 && num % 4 == 1 && num % 2 == 1)
    {
        Console.WriteLine("這些雞蛋最少有{0}個",num);
        break;
    }
    num++;
}

斷斷續續總算寫完了。新手上路。如果大家有什麼更好的方法或者覺得有任何不足,歡迎指正(Q:1044930001)