最新更新,截止14:50.
已經出現的題目:1 2 4 6 7 9 10 11 12 14 16 17 21 26 27 29 30 31 32 38 41 44 48 62 65 68 75 77 81 83 85 87 89 92 95 96 100 (有些是類似題,注意哦)
我抽到的南開的第41題,無憂的第51題
★☆題目41(無憂id 51 SIX/NINE問題)
下列程序prog1.c的功能是:計算出自然數SIX和NINE,它們滿足的條件是SIX+SIX+SIX=NINE+NINE的個數cnt以及滿足此條件所有的SIX與NINE的和SUM。請編寫函數countValue()實現程序的要求,最后調用函數writeDat()把結果cnt和sum,輸出到文件OUT15.DAT中。
其中的S,I,X,N,E各代表一個十進制數字。
部分源程序存在文件prog1.c中。
請勿改動主函數main()和輸出數據函數writeDat()的內容。
#include <stdio.h>
int cnt,sum;
void countValue()
{ int s,i,x,n,e,six,nine;
for(s=1;s<10;s++)
for(i=0;i<10;i++)
for(x=0;x<10;x++)
for(n=1;n<10;n++)
for(e=0;e<10;e++)
{ six=s*100+i*10+x;
nine=n*1000+i*100+n*10+e;
if(3*six==2*nine)
{ cnt++;sum+=six+nine;}
}
}
void main()
{
cnt=sum=0;
countValue();
printf("滿足條件的個數=%d\n",cnt);
printf("滿足條件所有的SIX與NINE的和=%d\n",sum);
writeDat();
}
writeDat()
{
FILE *fp;
fp=fopen("OUT15.DAT","w");
fprintf(fp,"%d\n%d\n",cnt,sum);
fclose(fp);
}
另一種經典解法:
void countValue()
{ int i;
for(i=666;i<=999;i=i+2)
if((i/10%10==(3*i/2)/100%10)&&((3*i/2)/1000==(3*i/2)%100/10))
{cnt++;sum+=i+3*i/2;}
}
運算結果為:
滿足條件的個數=4
滿足條件所有的SIX與NINE的和=9430
某網友:
抽到第一題
題目1:下列程序的功能是:將大于整數m且緊靠m的k個素數存入數組xx。請編寫函數num(int m,int k,int xx[])實現函數的要求 ,最后調用函數readwriteDAT()把結果輸出到文件out.dat中。
例如:若輸入17,5,則應輸出:19,23,29,31,37。
注意:部分源程序已給出。
請勿改動主函數main()和函數readwriteDAT()的內容void num(int m,int k,int xx[])
{int data=m+1;
int half,n=0,I;
while(1)
{half=data/2;for(I=2;I<=half;I++)
if(data%I==0)break;
if(I>half)
{xx[n]=data;n++;}
if(n>=k)break;
data++;
}
}
開始把
data%I==0 的I打成 !了 驚了一身冷汗!
幸虧發現!
呵呵
運行結果正確
交卷程序對的話就沒問題了
某網友:
我抽到出圈的題
是個200個四位數的,就是亂換位,然后不能被5整除,然后統計個數,排序。大概這個意思的,查了南開100題,沒有一模一樣的,只有相像的。幸虧我們考場松,我的朋友替我考的,結果大概是12個符合要求的,有人抽到這題馬?類似南開52題
****************************************************************************************
關于出圈題的詳細解答(希望對大家有所幫助)
出圈題的詳細解答
南開第57題:
解題思路:
題目中已經給出了算法過程,我們下面就看看怎么用代碼實現:
(1)將1到n個人的序號存入一維數組p中;
這個我想大家應該都沒有問題的了:很簡單的一句循環賦值。
for(i=1;i<=n;i++)p[i-1]=i;
(2)若第i個人報數后出圈,則將p[i]置于數組的倒數第i個位置上,而原來第i+1個至倒數第i個元素依次向前移動一個位置;
(3)重復第(2)步直至圈中只剩下p[1]為止。
難點就在這后面兩步,首先可以看出是要做一個循環,而且循環的條件是遞減
馬上可以先寫出一個循環遞減的框架
for(i=n;n>1;n--){}
接下來就是該怎么寫循環體的內容了:我們可以發現,題目的算法過程2描述的很清楚,具體如下:
s=(s+m-1)%i;首先,求出出圈人的位置,這里用一個求余是為了實現圈循環(也就是將隊列頭尾相連),這里i是圈中剩余的人數(除去出圈后的人)。 當然,我們稍微注意一下,那就是沒有第0位的出圈人存在,所以這里如果s=0是不對的,
其實這種情況是出圈人是隊尾的那一個人,所以這里加上一個判斷:
if(s==0)s=i;
好了,我們取到了出圈人的位置了,那我們就要:
"則將p[i]置于數組的倒數第i個位置上,而原來第i+1個至倒數第i個元素依次向前移動一個位置"
實現這一句的算法過程的代碼,可以看出也是一個循環:
w=p[s-1]; 首先,把出圈人的號碼暫時放起來(因為此時倒數第i個位置還有人占據,不能替換掉)
接著我們要把倒數第i個位置騰空出來,
而這個算法的實現就是“第i+1個至倒數第i個元素依次向前移動一個位置”
明白了這句話的意思后,馬上可以寫出下面的一個循環代碼來實現
for(j=s;j<i;j++)p[j-1]=p[j];出圈人的位置讓給他的下一位,依次類推,最后騰出倒數第i個位置給出圈人。
最后出圈人占據倒數第i個位置:p[i-1]=w;(注意這里第i個位置在數組中下標是i-1,因為數組下標是0開始的,^_^)
到這里為止,循環體也寫完了,整合起來,就可以得到下面的完整函數代碼了:
void Josegh(void)
{
int i,j,w; 定義一些用于暫時存放出圈人和循環變量。
for(i=1;i<=n;i++) 開始初始化循環賦值。
p[i-1]=i;
for(i=n;i>=2;i--) 循環體開始
{s=(s+m-1)%i; 尋找出圈人
if(s==0)
s=i;
w=p[s-1]; 暫時安置出圈人
for(j=s;j<i;j++) 給出圈人騰位置
p[j-1]=p[j];
p[i-1]=w; 重新安置出圈人
}
}
轉帖于:計算機等級考試_考試吧
·Exam8視線預告:2009年9月計算機等考試題點評 (2009-9-17 15:25:44)
·2009年9月全國計算機等級考試時間及科目介紹 (2009-9-14 17:32:07)
·梧州市2009年9月計算機等級考試時間調整通知 (2009-9-14 17:28:26)
·考試吧考后首發2009年9月計算機等考試題答案通知 (2009-9-11 15:47:25)
·西藏:2009年下半年計算機等級考試報名時間 (2009-6-21 15:04:35)