我遇到了一個問題,用戶輸入了用于對頁面進行編號的總位數,而程式給出了書中的總頁數。
(即一本 10 頁的書需要 11 個數字來編號,因為數字 1-9 是用一個數字寫的,而數字 10 是用兩個數字寫的;一本 11 頁的書需要 13 個數字......)。
我通過使用while回圈進行了嘗試,但它沒有運行,因為它超過了執行時間。
我的 C 代碼如下所示:
#include <stdio.h>
int main() {
int n, pages = 9;
scanf("%d", &n);
if (n <= 9) {
printf("%d",n);
}
else if (n % 2 == 0) {
printf("Invalid input");
}
else {
while (n < 9) {
pages ;
n -= 2;
}
}
return 0;
}
誰能幫我解決這個問題?
uj5u.com熱心網友回復:
else if(n%2==0) { printf("Invalid input"); }
請注意,有超過 100 頁的書籍:
一本102頁的書有198個數字!
while(n!=0) { pages ; n-=2; }
這個回圈將永遠運行:
因為n最初是奇數,n-2所以也是奇數。n如果是n-=2唯一修改n. n不能變為 0,因此回圈將永遠運行。
您還必須考慮可能存在超過 100 頁或超過 1000 頁的書籍。
我會反過來做,pages從 1 計數到 N。我會總結給定頁數所需的位數,并在超過位數時停止:
int n, pages=0, digits=0;
int realdigits=0, neededdigits, tooLarge;
/* "realdigits" is the number of digits required
* by "pages" pages; loop until
* "realdigits" >= "digits" */
while(realdigits < digits)
{
pages ;
/*
* Add some code that calculates:
* neededdigits = Number of digits required by
* the number "pages"
*/
realdigits = neededdigits;
}
/* Case: "(pages-1)" pages need less digits
* than "digits" but "pages" pages need more
* digits... */
if(realdigits > digits)
{
printf("Invalid number\n");
}
else
{
printf("%d pages\n", pages);
}
我將使用基于條件的回圈來計算數字所需的位數pages:
neededdigits = 1;
tooLarge = 10; /* Number that is too large for digits */
while(pages >= tooLarge)
{
neededdigits ;
tooLarge *= 10;
}
請注意,在“類 C”編程語言(C、C 、Java、C#、PHP ...)中,您可以將for關鍵字用于“基于條件的”回圈...
uj5u.com熱心網友回復:
在您的帖子正文中,您不會問任何問題(除了“有人可以幫助我嗎?”,這在此處不被視為問題)。在您的評論中,您要求提供main()函式、邏輯或偽代碼。抱歉,這不是 StackOverflow 的用途。
但最后你問如何得出所需的公式。
隨著我如何提出和回答家庭作業問題?請記住,我會幫助你。
- 做一個最簡單的情況(1,2,3,4,5,6,7,8,9)頁和數字的表,相同
- 找到那個公式
- 檢查下一個復雜情況(10,11,12,13,14,...99)的頁數和位數,有一個很簡單的關系
- 考慮第 1...9 頁對公式的影響,考慮偏移
- 考慮下一個復雜情況 (100, 101, .... 999)
- 并繼續達到上述 20 億頁的限制
uj5u.com熱心網友回復:
考慮使用這樣的連續測驗:
- 如果
number <= 9,則頁數為,number否則設定pages = 9并減去9。number - 如果
number <= 90 * 2,則頁數為,pages number / 2否則設定pages = 90并減去90 * 2。number - 如果
number <= 900 * 3,則頁數為,pages number / 3否則設定pages = 900并減去900 * 3。number - 等等。
number您可以撰寫一個回圈來解決問題,而無需對用于存盤和的型別的范圍做出假設pages。
int number_of_pages(int number_of_digits) {
int n1 = 9, n2 = 1, pages = 0;
while (number / n2 > n1) {
pages = n1;
number -= n1 * n2;
n1 *= 10;
n2 = 1;
}
return pages number / n2;
}
uj5u.com熱心網友回復:
沒有回圈!使用log10()和pow()來自數學庫。
基于在OEIS A058183 上找到的公式:“前 n 個正整數的級聯中的位數。”
#include <math.h>
int digits_for_pages(unsigned n) {
// oeis A058183
return (n 1)*floor(log10(10*n)) - (pow(10, floor(log10(10*n)))-1)/(10-1);
}
https://ideone.com/7GJYXq
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/424463.html
上一篇:鏈表實作出錯
下一篇:如何制作從最小到最大的回圈?
