swust oj代碼+解析_1165,0284,0074,0042,1171,0026,0189,0078,0046,0077,0209,0129

swust oj 1165,0284(int a[n]\數字根),0074,0042,1171(矩陣相乘 輸出對齊),0026/0189,0078(計算生日是星期幾),0046,0077(計算員工周工資),0209,0129




1165

1.在輸入n後,可以用int a[n]的方式定義數組大小,oj不支持a[]形式

2.注意題目要求,多組還是單組,輸入輸出格式



0284疑問:

1.輸入至0時結束不可以用類似while((scanf("%d",&a))!=0)的表示麼

2.對一個數求數字根有更簡潔的寫法麼,如何將兩個do while語句合併(使用if else語句實在只是保全之策)




0074:

1.矩陣的定義數組需要比數據多申請一個\0的位置, 故m行n列的數組需要申請a[m][n]
2.思路:輸入兩個矩陣,矩陣相乘,輸出矩陣,用四個大for循環
3.輸入矩陣的方法~for的嵌套
4.矩陣相乘的時候用c[i][j] += a[i][k]*b[k][j]感覺不錯



0042:
1.oj提交題的時候注意printf時加上\n,否則就PE了
2.整數的相除結果自動取整,不要每次都被坑好不好



1171:
1.利用ah=ah+bh減少變量的個數使行文更簡潔
2.輸出的對齊:(以整數爲例)
v 在"%"和字母之間插進數字表示最大場寬。如:%8d表示在輸出一個小於8位的數值時, 將在前面補空格使其總寬度 爲8位;

v 可以控制輸出左對齊或右對齊, 即在"%"和字母之間加入一個"-" 號可說明輸出爲左對齊, 否則爲右對齊。例如: %-7d 表示輸出7位整數左對齊 ;

v 若想在輸出值前加一些0, 就應在場寬項前加個0。例如:%02d 表示在輸出一個小於2位的數值時, 將在前面補0使其總寬度 爲2位;%022表示得到22位數,不足用0補足;















 
圖片

0026:

1.實現多組輸入用 while(scanf("%d %d",&a1,&b1)!= EOF),當輸入變成多組之後,就要考慮數據再一次的初始化。

2.求翻轉數的核心:do while部分 

圖片

0189:
這道題上耗了好久上次碰它是上個月了都。

解決一個問題要從思路開始,混亂的思路並不能邊寫便理清,而是從頭開始亂到底。找到了大的方向,細枝末節的問題可以一個一個慢慢改,也不會覺得混亂。

《天龍八部之宿敵》陪這兩篇代碼。
晚安。







0078(switch,判斷平閏年)
 雖然看上去只有幾十行,但對於我這種學渣已經很費神費力了.
[思路]第一個for循環判斷平年還是閏年,據此對a賦值,順便把前面年份的天數賦給total.
第二個for循環把當前年的前面月份的天數賦給total,順便把日期的天數賦給total.
最後switch語句根據total的值輸出星期幾.
..........語段分割線......
[經驗]1.for着重於循環次數的控制,while着重於循環條件的控制.(有待深入理解區別)
2.每個數據在使用之前需要一個賦值,通過scanf或者i=1類型.for中i=1,在開頭還是需要爲i賦值,否則year=1的特殊情況便無i值(然而其實此題好像不必).
3.switch語句中需要break,不是沒有也不是continue,因爲需要退出整個switch語句.
4.若switch()的括號中是一個數字,
 那麼case後面如果是數字就能運行;但你如果是 '1'就代表1是個字符,而不是數字(所以之前用case'+'就沒問題).
5.if語句的else與else if的區別:else if後面必須有一個判斷條件,一般else就夠用了.
6.if語句小括號裏,非:(!(表達式))  且(表達式1 && 表達式2)       或(表達式1 || 表達式2).好像一般兩個表達式的非可以用另外兩種來表示,目前不清楚兩個表達式的非怎麼表示.
7.if(a==0)纔是判斷,if(a=0)是什麼鬼,暫時還不能喫.
8.經檢驗,total+=365 這種表達方式oj是支持的.
9.對於判斷平閏年,有更簡單的方式(偷來的):
if(a%4==0&&a%100!=0||a%400==0).




圖片


圖片

圖片






0046
 第一張是自己寫的,看看別人寫的,好像是我想法太複雜,用了很多的單詞表示,不過求次方還是會了
圖片

圖片

0077
 ***float--%f     double--%lf
***if語句中的或與非,|| & ! 都寫在括號裏面
***當你不清楚小數點後是否保有有效數據的時候,你可以用%g輸出如printf("%g\n",answer);
如answer爲12.50自動輸出12.5,若answer爲12.00自動輸出12
[優化]printf語句可以合併滴。
圖片


0209

這個問題千迴百轉的,算來算去要用很多步驟,運算時間也會拉長很多,那麼,爲什麼不轉換一下思維使之變得簡潔呢.

每次%2,得到最後一位k位,翻轉之後會到第k位,k++,那麼第k位的轉換成二進制會乘2的n-1-k次方,一步到位罷.



#include<stdio.h>
#include<math.h>
int main()
{
    int m,n,a,sum,k;
	while(scanf("%d %d",&m,&n)!=EOF)
	{
		sum=k=0;
		while(k<n)
		{
			a=m%2;
			sum+=a*(int)pow(2,n-1-k);
			m/=2;
			k++;
		}
		printf("%d\n",sum);
	}
    return 0;
}





0129(轟炸)
#include<stdio.h>
int main()
{
	int i,j,t,n,x[705],y[705],time,max=2;
	while(scanf("%d",&n)!=EOF)
	{
		max=2;
		for(i=0;i<n;i++)
		{
			scanf("%d %d",&x[i],&y[i]);
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<n && i!=j;j++)
			{
				time=2;
				for(t=0;t<n && t!=i && t!=j;t++)
				{
					if((y[i]-y[j])*(x[i]-x[t])==(x[i]-x[j])*(y[i]-y[t]))
						time++;
				}
				if(time>max)max=time;
			}
		}
		printf("%d\n",max);
	}
	return 0;
}


思路在代碼裏哦



移自本人QQ空間
written by Sneexy.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章