匿名
https://i.imgur.com/3hcPARE.png
目前有打出來,但對老師的評斷系統顯示超過限制時間。
以下是我的程式碼,希望高手能幫我看一下哪裡可以精簡或是提供更好的想法。
#include<iostream>
using namespace std;
int main(void)
{
char ch;
string st,ary,ary1,ary2,ary3,ary4,ary5,ary6,ary7,ary8,ary9,ary10;
int count=0;//算單字由幾個字母組成
cout<<"Input:";
while(ary+=(ch=cin.get()),ch!='\n');//輸入英文句子
int sum=0;
int sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,sum6=0,sum7=0,sum8=0,sum9=0,sum10=0;
int b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,b10=0;
int a=ary.length();
for(int i=0;i<a;i++)
{
if(ary[i]>='A'&&ary[i]<='Z'||ary[i]>='a'&&ary[i]<='z'||ary[i]=='-'||ary[i]=='\'')
{
st+=ary[i];
count++;
}
else if(st!="")
{
if(count==1)
{
sum1++;
if(b1==0)
ary1+=st;
else
{
ary1+=",";
ary1+=st;
}
b1++;
}
else if(count==2)
{
sum2++;
if(b2==0)
ary2+=st;
else
{
ary2+=",";
ary2+=st;
}
b2++;
}
else if(count==3)
{
sum3++;
if(b3==0)
ary3+=st;
else
{
ary3+=",";
ary3+=st;
}
b3++;
}
else if(count==4)
{
sum4++;
if(b4==0)
ary4+=st;
else
{
ary4+=",";
ary4+=st;
}
b4++;
}
else if(count==5)
{
sum5++;
if(b5==0)
ary5+=st;
else
{
ary5+=",";
ary5+=st;
}
b5++;
}
else if(count==6)
{
sum6++;
if(b6==0)
ary6+=st;
else
{
ary6+=",";
ary6+=st;
}
b6++;
}
else if(count==7)
{
sum7++;
if(b7==0)
ary7+=st;
else
{
ary7+=",";
ary7+=st;
}
b7++;
}
else if(count==8)
{
sum8++;
if(b8==0)
ary8+=st;
else
{
ary8+=",";
ary8+=st;
}
b8++;
}
else if(count==9)
{
sum9++;
if(b9==0)
ary9+=st;
else
{
ary9+=",";
ary9+=st;
}
b9++;
}
else if(count==10)
{
sum10++;
if(b10==0)
ary10+=st;
else
{
ary10+=",";
ary10+=st;
}
b10++;
}
count=0;
st="";//st置空
}
}
cout<<"1Word"<<" "<<sum1;
if(sum1!=0)
cout<<"("<<ary1<<")";
cout<<"\n2Word"<<" "<<sum2;
if(sum2!=0)
cout<<"("<<ary2<<")";
cout<<"\n3Word"<<" "<<sum3;
if(sum3!=0)
cout<<"("<<ary3<<")";
cout<<"\n4Word"<<" "<<sum4;
if(sum4!=0)
cout<<"("<<ary4<<")";
cout<<"\n5Word"<<" "<<sum5;
if(sum5!=0)
cout<<"("<<ary5<<")";
cout<<"\n6Word"<<" "<<sum6;
if(sum6!=0)
cout<<"("<<ary6 <<")";
cout<<"\n7Word"<<" "<<sum7;
if(sum7!=0)
cout<<"("<<ary7<<")";
cout<<"\n8Word"<<" "<<sum8;
if(sum8!=0)
cout<<"("<<ary8<<")";
cout<<"\n9Word"<<" "<<sum9;
if(sum9!=0)
cout<<"("<<ary9<<")";
cout<<"\n10Word"<<" "<<sum10;
if(sum10!=0)
cout<<"("<<ary10<<")";
return 0;
}
你可能有興趣的文章...
全部留言
我先附上code,我在下一則那邊講解 https://github.com/Miohitokiri/Codes/blob/master/test.cpp
大概看了一下,你的做法有點複雜 1. 你用cin/cout卻沒有開IO優化,這樣速度會很慢(雖然我覺得你們老師沒有卡這個) 2. 一個一個做if else太耗時間了,我是直接開陣列紀錄,這樣可以少掉if else的比較時間 3. string + string 的操作我印象中也很浪費時間(?)(我不是很確定,我平常都是直接開vector push_back)(雖然我覺得你們老師應該也沒有卡這個) btw我除了那行#include && IO優化我猜你可能會看不懂外(這個我最後講) 其他你應該都可以。。。吧(我就assume你可以吧,畢竟那些都是C++的標準STL,之類的) 假設你不會用陣列紀錄,也不會IO優化 那麼有另外一個比較好的解決方法:用switch 大概這樣 switch ( size ){ case 1: ... case 2: ... } 大概像這樣,switch的詳細用法可以自己google一下了 然後我講講bits/stdc++.h這個邪惡的標頭檔 基本上來說這不是標準,所以只能在GNU GCC/G++上使用 這標頭檔的功能是什麼呢? 簡單來說就是把你各種用得到的、用不到的其他標頭檔都include進來XD 然後IO優化 簡單講就是可以加速C++的cin/cout 深入一點講。。。你可以看這篇(不是我寫的)文章,這邊應該講得比較清楚(人如其名) http://chino.taipei/note-2016-0311C-的輸出入cin-cout和scanf-printf誰比較快?/ 大概就是這樣
匿名
@B2 抱歉讓你看得很辛苦~如你所說,那行#include && IO優化我真的是第一次看到.....我目前只學到C++基本語法,所以有些東西是靠google來的(如:while(ary+=(ch=cin.get()),ch!='\n');//輸入英文句子這行)。 我有把它改成switch case的再傳,系統一樣跳超過限制時間.... 對了說一下我使用的是DevC++再寫程式,然後系統規定執行畫面中的最後一行是不用換行的
B9 其實只要寫 while ( cin >> str ) 這樣就可一直讀數字下去了(? 阿不對,你要吃換行,沒事
B11 用while ( cin >> str ) 要等到他讀到EOF ( end of file ) 才會結束 然後我沒記錯的話再 win 下面是要按 ctrl + z,不然就是要開cmd導入檔案到執行檔裡面 我比較習慣用Unix-like的系統,我不確定我的回答是否正確,如果有誤請用力鞭打(X
B13 嚴格來說不算 Unix只有指100%都是Unix無調整吧(? 通常只拿核心來用還是叫 Unix-like(?
B13 我查到了,macOS 是類 Unix 也就是 Unix-like https://zh.wikipedia.org/zh-tw/类Unix系统 況且我平常不用 macOS 也是用 Arch 啊,Arch 就是 Unix-like 了吧
*這種程式如果會跑太久 基本上就是有哪裡寫錯了 不會是效率問題 你可以往這方面去抓bug* while(ary+=(ch=cin.get()),ch!='\n'); 越到'\n'(換行) 才會停 但input最後不一定會有換行 沒有的話就會卡到死 直接用while(cin.get(ch))就可以避免 這點可以先上judge確認一下 然後可以善用array 把ary1-10 寫成ary[10] 這樣就能用for loop一次做完 例如最後的輸出可以寫成: for (i=0; i<10; i++) cout << i << "Word " << sum[i]; if (sum[i] != 0) cout << " ("<< ary[i] <<")\n "; 同理中間那段也能這樣改 最後大概可以把200行的程式壓到30行左右 另外運算符前後都建議加個空格 同樣是為了可讀性跟方便除錯