C說話初學者代碼中的罕見毛病與成績。本站提示廣大學習愛好者:(C說話初學者代碼中的罕見毛病與成績)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話初學者代碼中的罕見毛病與成績正文
成績
開燈成績
有n盞燈,編號為1~n,第1小我把一切燈翻開,第2小我按下一切編號為2 的倍數的開關(這些燈將被關失落),第3 小我按下一切編號為3的倍數的開關(個中關失落的燈將被翻開,開著的燈將被封閉),依此類推。一共有k小我,問最初有哪些燈開著?輸出:n和k,輸入開著的燈編號。k≤n≤1000
#include <stdio.h>
#include <math.h>
int main()
{
int a[1001],n,k,i,j;
printf("請分離輸出燈和人的數目\n");
scanf("%d%d",&n,&k);
while(1) //磨練能否超越
{
if(k>=1 && k<=1000 && n>=k && n<=1000)
break;
else
{
printf("數值不符,請從新輸出:\n");
scanf("%d%d",&n,&k);
}
}
for(i=2;i<=k;i++) //每操作一次序遞次i*j個開關,a[i*j]加1
{
for(j=1;i*j<=n;j++)
{
a[i*j]=a[i*j]+1;
}
}
for(i=1;i<=n;i++) //若操作次數為偶數,表現該地位的燈亮著
{
if(a[i]%2==0 && a[i]!=0)
printf("%d\t",i);
}
printf("\n");
return 0;
}
測試:
“本身測了認為沒成績..在線體系成果是WrongAnswer ..未找出緣由..”
評:
最顯著的毛病就是第26行
a[i*j]=a[i*j]+1;
因為後面界說a數組為部分auto種別,在不停止初始化的情形下,a中的數據是渣滓值。換句話說,a中的數據是有意義的。是以a[i*j]+1這個表達式沒成心義。
另外,第22行
for(i=2;i<=k;i++) //每操作一次序遞次i*j個開關,a[i*j]加1
在邏輯上也是毛病的,缺少“第1小我把一切燈翻開”的步調。
別的
printf("請分離輸出燈和人的數目\n");
scanf("%d%d",&n,&k);
while(1) //磨練能否超越
{
if(k>=1 && k<=1000 && n>=k && n<=1000)
break;
else
{
printf("數值不符,請從新輸出:\n");
scanf("%d%d",&n,&k);
}
}
這段寫得很丑,屬於典范的譚浩強作風,C說話應當如許寫:
printf("請分離輸出燈和人的數目\n");
while(scanf("%d%d",&n,&k) ,( k <1 || n<k || n>1000) )
{
printf("數值不符,請從新輸出:\n");
}
代碼中還有其他一些缺點,因為不是最重要的成績,這裡就不再進一步指出了。
重構:
#include <stdio.h>
#define MAXNUM 1000
#define ON 0
#define OFF 1
int main( void )
{
int light[MAXNUM] = { ON } ; //把一切燈翻開
int n , k ;
int i ;
printf( "請分離輸出燈和人的數目\n" );
while ( scanf("%d%d", & n ,& k ) ,( k < 1 || n < k || n > MAXNUM ) )
printf("數值不符,請從新輸出:\n");
for ( i = 2 - 1 ; i < k ; i ++ ) //第2小我按下一切編號為2 的倍數的開關……
{
int j ;
for ( j = i ; j < n ; j += i + 1)
light[j] = ! light[j];
}
for ( i = 0 ; i < n ; i ++ )
if( light[i]==ON )
printf( "%d " , i + 1 );
putchar('\n');
return 0;
}