今天練習簡單算法題,遇到下面需求:
韓信點兵問題:讓士兵先后三人一排,五人一排,七人一排變換隊形,每次只需要掠一眼尾數就知道有多少人。輸入包含多組數據,每組數據包含3個非負整數a,b,c,表示每種隊形排尾的人數(a<3,b<5,c<7)輸出總人數的最小值或者報告無解。已知總人數不小於10,不超過100.輸入到文件結束為止。
樣例輸入:
2 1 6
2 1 3
樣例輸出:
41
沒有結果
-------------------------------------------------------------------------------------------------------------------------------------
問題不難,只是最后要求輸入到文件結束為止。我想這個需要使用文件輸入,重定向也可。控制語句可以while(fscanf(fin,"%d %d %d",&a,&b,&c)==3 && !feof(fin))
這就出了問題,因為fscanf讀取的時候指針是會移動的,當讀取最后一行時feof為1,如果像我上面這么寫,會導致最后一行的輸入數據讀取不進去。
另外我對於fscanf的返回值了解不夠也讓我在這里卡了很久。fscanf如果像上面成功讀取3個,返回值就是3,只成功讀取1個,返回值就是1,一個都沒讀取就是0;如果遇到錯誤或者讀到文件末尾會返回EOF(EOF的值為-1)。
這就有三種方式來控制
(1)while(fscanf(fin,"%d %d %d",&a,&b,&c)==3)
{
。。。。。。
}
(2)while(fscanf(fin,"%d %d %d",&a,&b,&c))
{
。。。。。。
if(feof(fin))break;
}
(3)while(~fscanf(fin,"%d %d %d",&a,&b,&c))
{
。。。。。。
}
對於(3),因為EOF=-1,按位取反就是0,作用和(2)差不多
