第十周編程總結
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;
}
第十周編程總結