1. 程式人生 > >第十周編程總結

第十周編程總結

多少 思路 運行 定義 如果 系列 item 循環 sca

7-1 求奇數和 (15 分)

本題要求計算給定的一系列正整數中奇數的和。

1)實驗代碼

#include<stdio.h>
int main()
{
int n,sum=0;
scanf("%d",&n);
while(n>0)
{
if(n%2!=0) {
sum+=n;
}
if(n%2==0) {
sum=sum;
}
scanf("%d",&n);
}
printf("%d",sum);
return 0;
}

2)設計思路

1.定義變量,sum賦初始值0

2.使用while循環,條件n>0,先輸入一位數字,判斷是否大於0,如果是就繼續執行,再判斷n是否為奇數,為奇數累加,為偶數不變,再輸入下一位數字繼續循環;否則就跳出循環

3.輸出

3)本題調試過程碰到問題及解決辦法

無問題

4)運行結果截圖

7-2 求整數的位數及各位數字之和 (15 分)

對於給定的正整數N,求它的位數及其各位數字之和。

1)實驗代碼

#include<stdio.h>
int main()
{
int n,b,s=0,count=0;
scanf("%d",&n);
while(n>0)
{
b=n%10;
s+=b;
n=n/10;
count++;
}
printf("%d %d",count,s);
return 0;
}

2)設計思路

1.定義變量,輸入n,b代表余數,s代表余數累加,count記錄位數

2.當n>0,首先(1)求n除以10求余數,累加,然後(2)n除以10,位數累加,不斷循環,直到n<0就跳出循環(註意:必須先(1)後(2),二者順序不能顛倒)

3.輸出位數和各位數字之和

3)本題調試過程碰到問題及解決辦法

把(1)和(2)的順序顛倒了,最後通過調試找到錯誤並解決

4)運行結果截圖

7-3 韓信點兵 (10 分)

在中國數學史上,廣泛流傳著一個“韓信點兵”的故事:韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點兵的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數:

  • 按從1至5報數,記下最末一個士兵報的數為1;
  • 再按從1至6報數,記下最末一個士兵報的數為5;
  • 再按從1至7報數,記下最末一個士兵報的數為4;
  • 最後按從1至11報數,最末一個士兵報的數為10;

請編寫程序計算韓信至少有多少兵。

1)實驗代碼

#include <stdio.h>
int main()
{
int i=0;
while(1)
{
if(i%5==1&&i%6==5&&i%7==4&&i%11==10)
{
break;
}
i++;
}
printf("%d",i);
return 0;
}

2)設計思路

1.定義變量i賦初值為0

2.用while無限循環,如果i滿足四個條件就輸出(i%5==1&&i%6==5&&i%7==4&&i%11==10),否則i++,繼續循環

3.輸出

3)本題調試過程碰到問題及解決辦法

剛開始做的時候題目都沒讀懂,無從下手,後來才知道這是一個數學題,數學很重要啊

4)運行結果截圖

7-4 整除光棍 (20 分)

這裏所謂的“光棍”,並不是指單身汪啦~ 說的是全部由1組成的數字,比如1、11、111、1111等。傳說任何一個光棍都能被一個不以5結尾的奇數整除。比如,111111就可以被13整除。 現在,你的程序要讀入一個整數x,這個整數一定是奇數並且不以5結尾。然後,經過計算,輸出兩個數字:第一個數字s,表示x乘以s是一個光棍,第二個數字n是這個光棍的位數。這樣的解當然不是唯一的,題目要求你輸出最小的解。

提示:一個顯然的辦法是逐漸增加光棍的位數,直到可以整除x為止。但難點在於,s可能是個非常大的數 —— 比如,程序輸入31,那麽就輸出3584229390681和15,因為31乘以3584229390681的結果是111111111111111,一共15個1。

1)實驗代碼

思路1:

#include <stdio.h>
int main()
{
int x = 0, s = 0, n = 0;
scanf("%d", &x);
while (s < x)

{
s = s * 10 + 1;
n++;
}
while (1)
{
printf("%d", s / x);
s %= x;
if (s == 0) break;

s = s * 10 + 1;

n++;
}
printf(" %d\n", n);
return 0;
}

2)設計思路

1.定義輸入的數x(除數),被除數s,位數n

2.當s<x時,s = s * 10 + 1,位數+1,循環

3.當s>=x時,跳出第一個循環;在第二個循環中,輸出s/x(輸出商, 從最高位一直輸出到個位,最後一定能被整除),s更新為余數(s%x),當余數為0時,表示x被除盡,跳出循環,輸出n;否則s = s * 10 + 1;位數+1;

4.返回主函數

3)本題調試過程碰到問題及解決辦法

1.剛開始題目都沒讀懂,後來百度+問大佬,弄清楚了思路

2.要註意輸出過程中中間的s中可能為0,不要把這個漏掉了

4)運行結果截圖

思路2:

#include<stdio.h>
int main()
{
int x,s=0,n=0,flag=0; /*定義 輸入的正奇數,表示x乘以s是一個光棍,光棍的位數,變量標記*/
scanf("%d",&x);
while(1) /*無限循環*/
{
s=s*10+1;
n++; /*光棍位數累加*/
if(s>=x) /*s從1開始,循環遞增*/
{
flag=1;
printf("%d",s/x); /*輸出每一次的s/x(取整)*/
}
else if(flag==1)
printf("0"); /*當s<x時,補0*/
s=s%x;
if(s==0) break; /*余數為0時,跳出循環*/
}
printf(" %d",n);
return 0;
}

第十周編程總結