洛谷P1957 做題筆記
洛谷P1957做題筆記
程式碼如下:
#include<stdio.h>
#include<string.h>
#define N 10001
char s[N],s1[N],s2[N];
char ch,t;
int x,y;
int len,len1,len2;
void sort (char t)
{
if(t=='a')
{
int sum=x+y;
sprintf(s,"%d+%d=%d",x,y,sum);
printf("%s",s);
len=strlen(s);
printf("\n");
printf("%d\n",len);
}
if(t=='b')
{
int sum=x-y;
sprintf(s,"%d-%d=%d",x,y,sum);
printf("%s",s);
len=strlen(s);
printf("\n");
printf("%d\n",len);
}
if(t=='c')
{
int sum=x*y;
sprintf(s,"%d*%d=%d",x,y,sum);
printf("%s",s);
len=strlen(s);
printf("\n");
printf("%d\n",len);
}
memset(s1,0,strlen(s1));
memset(s2,0,strlen(s2));
memset(s,0,strlen(s));
}
int main()
{
int n;
scanf("%d",&n);
// printf("%d\n",n);
for(int i=0;i<n;i++)
{
scanf(" ");
scanf("%c",&ch);
if('a'<=ch&&ch<='c')
{
scanf(" ");
t=ch;
// printf("t=%c\n",t);
scanf("%d%d",&x,&y);
}
else
{
int v=1,b=0;
scanf(" ");
s1[0]=ch;
// printf("s1[0]=%c\n",s1[0]);
while(1)
{
scanf("%c",&ch);
if(ch==' ')
break;
else
{
s1[v]=ch;
//printf("s[v]=%c v=%d\n",s1[v],v);
v++;
}
}
gets(s2);
len1=strlen(s1);
len2=strlen(s2);
//printf("len1=%d len2=%d\n",len1,len2);
sscanf(s1,"%d",&x);
sscanf(s2,"%d",&y);
}
sort(t);
}
return 0;
}
關於此題的幾點總結:
1.1 對memset()函式的使用的理解
眾所周知,memset()的主要用法為將陣列清零。但如何清零是作為新手的第一個問題。
關於這個函式我試過三種方式,只有一種達到目的。
1.1.1
memste(s1,'0',sizeof(s1));
這樣做會使s1的所有元素變為’0‘。如果用strlen(s1)去檢視字串長度的話,可以發現長度為100(定義的長度),所以這樣做的目的是將陣列內的所有開闢的記憶體存入’0‘。
1.1.2
memset(s1,'0',strlen(s1));
這樣做也是代換的一種,和上一種方式不同的點是這個只會將輸入的字元替換為’0‘。
1.1.3
memset(s1,0,strlen(s1));
這樣做和前兩種不一樣,這樣寫才能做到真正意思上的“重啟”。
1.2 對sscanf()的初級使用
1.2.1
擷取片段文章:
(1)sscanf("zhoue3456 ", “%4s”, str); //取指定長度的字串
printf(“str=%s\n”, str); //str=“zhou”;
這裡我先學習sscanf()的最初級用法
可以看出,sscanf()函式的主要用法是對字串的擷取和強制轉換。
但要注意
int n;
char s[100];
scanf("%d",&n);
sscanf("n","%s",s);
*這樣做是無效的,輸出的s為n。 *
參考Citronnelle2的文章:
定義函式 int sscanf (const char *str,const char * format,…);
函式說明
sscanf()會將引數str的字串根據引數format字串來轉換並格式化資料。格式轉換形式請參考scanf()。轉換後的結果存於對應的引數內。
返回值 成功則返回引數數目,失敗則返回-1,錯誤原因存於errno中。 返回0表示失敗 否則,表示正確格式化資料的個數
由此定義可知,前面的引數一定要是一個char型別的引數,int型別的不可以作為引數輸入。
所以目前看來sscanf()的用法主要是將char 型別的陣列轉變為int 型別輸入到一個引數中去,這樣做可以在一定程度上化簡步驟。
1.3 對sprintf()函式的使用
格式化數字字串
sprintf 最常見的應用之一莫過於把整數列印到字串中,所以,spritnf 在大多數場合可以替代
itoa。如: //把整數123 列印成一個字串儲存在s 中。 sprintf(s, “%d”, 123); //產生"123"
可以指定寬度,不足的左邊補空格: sprintf(s, “%8d%8d”, 123, 4567); //產生:" 123 4567"
當然也可以左對齊: sprintf(s, “%-8d%8d”, 123, 4567); //產生:“123 4567”
說簡單點就是將整數型別轉變為char型別儲存到陣列中去,這樣做的主要好處就是便於計算長度,如此題中的計算a+b=c的長度。
但是,要注意一點
sprintf(s,"%d+%d=%d\n",a,b,c);
如果在第二欄裡面輸入了一個’\n‘,那麼你用strlen()計算出來的長度會包括一個’\n‘。所以如果你要實現換行,最好令起一行輸入
printf("\n");
相關文章
- 洛谷 P1783 海灘防禦 做題記錄
- 洛谷 P1365 WJMZBMR打osu! / Easy 做題記錄
- 洛谷-P2178 學習筆記筆記
- 洛谷 P8572 [JRKSJ R6] Eltaw 做題記錄
- 洛谷 P1144 最短路計數 做題記錄
- 洛谷八皇后問題
- 洛谷 P3128 [USACO15DEC] Max Flow P 做題記錄
- 洛谷 P2890 [USACO07OPEN] Cheapest Palindrome G 做題記錄
- 洛谷
- 洛谷 P1772 [ZJOI2006] 物流運輸 做題記錄
- 洛谷題單指南-字串-Test字串
- 洛谷-P9574 題解
- 洛谷 P1850 [NOIP2016 提高組] 換教室 做題記錄
- 洛谷 P3226 [HNOI2012] 集合選數 做題記錄
- 洛谷-P9830 題解
- 洛谷P5057簡單題
- 洛谷 P11268 【MX-S5-T2】買東西題 做題記錄
- 洛谷 P1841 [JSOI2007] 重要的城市 做題記錄JS
- 洛谷團隊
- 洛谷T90444 密碼 題解密碼
- [題解][洛谷P3584] LAS
- [題解][洛谷P3594] WIL
- 「雜題亂刷」洛谷 P2572
- 洛谷P2440 木材加工 題解
- 【題解】洛谷P1613: 跑路
- 字串做題筆記字串筆記
- 做題筆記 IIII筆記
- 考前做題筆記筆記
- 「雜題亂刷」洛谷 P4801
- 洛谷P1644跳馬問題
- [題解] [洛谷P1404] 平均數
- 洛谷死亡時間
- 洛谷 - P5369
- 洛谷P6786
- 洛谷P1786
- 構造做題筆記筆記
- 貪心 做題筆記筆記
- [題解][洛谷P1578] 奶牛浴場