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)