[英]C program to find growing numbers in an inverval
首先,對不起我的英語,如果我的解釋不夠好。 希望我的代碼輸出可以幫助您了解它的含義。 問題是,按照我的方式,它只能在999(3位數字)以下使用。 我猜應該有一個“不在乎”有多少位數的循環,它只是做了必須要做的事情。
int main(){
int n, m, k, digit1, digit2, digit3, p, a = 0;
do{
printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n);
if (m < n) {
break;
}
else printf("\Error - m > n! Try again.\n\n");
} while (a == 0);
printf("Output:\n");
for (k = m; k <= n; k++){
p = k;
do{
digit3 = p % 10; //123 % 10 = 3 13%10 = 3 == p/10 +1
digit1 = p / 100; //123 / 100 = 1
digit2 = (p / 10) % 10; // (123 /10) = 12%10 = 2
if (p > 100){
if ( digit2 == digit1 + 1 && digit3 == digit2 + 1){
printf("%d ", k);
} break;
}
if (digit3 == ((p / 10) + 1)) {
printf("%d ", k);
} break;
p = p / 10;
} while (p > 0);
}
getch();
return 0;
}
輸出示例:
Enter m and n (m < n):
1 999
Output:
1 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789
此輸出是正確的,這是程序必須執行的操作。 不幸的是,我無法使用循環使其超過999。它應該輸出所有數字(在用戶輸入的間隔內),其中每個數字都比前一個數字大(乘以1)。
您不需要一次跟蹤所有數字。 您需要檢查的是最后一位比第二位多一位
像這樣的東西
int main(){
int n, m, k, digit1, digit2, digit3, p, a = 0;
do{
printf("Enter m and n (m < n):\n"); scanf("%d %d", &m, &n);
if (m < n) {
break;
}
else printf("\Error - m > n! Try again.\n\n");
} while (a == 0);
printf("Output:\n");
k = m;
while(k++ <= n){
int p = k;
int flag = 0;
int num;
while(p > 10){
// Get the last digit
// in case of 123 -> 3
num = p % 10;
// Reduce p by 10
// 123 -> 12
p = p/10;
// check 3 == 12%10 + 1
// if this is correct go back to start of the loop
// we may have more digits
if(num == p % 10 + 1) continue;
// So the digits dont match, set the flag
// break out of the loop
flag = 1;
break;
}
// Outside the loop check the flag and print
if(k > 10 && !flag)
printf("%d ",k);
}
return 0;
}
這是我的看法。 將問題分成幾部分:您需要一個函數來檢查數字是否在“增長”,這意味着以10為底的表示形式中的每個數字都是與以下乘方10的冪相對應的整數,最高為非零。 (比正式表達這個概念要難得多)。
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
bool growing(unsigned int x)
{
//if (x < 10)
// return false;
unsigned int last = x % 10 + 1;
while (x>0) {
unsigned int cur = x % 10;
x /= 10;
if (cur != last-1)
return false;
last = cur;
}
return true;
}
int main(void)
{
unsigned int m = 1;
unsigned int n = 123456789;
for (unsigned int i = m; i <= n; ++i) {
if (growing(i)) {
printf("%i ", i);
}
}
}
您應該確定是否接受一個數字。 如果是,請取消注釋前兩行。
顯然,最高的增長數字是123456789。
編輯:無功能的版本,直接將函數移到for循環中:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
unsigned int m = 1;
unsigned int n = 123456789;
for (unsigned int i = m; i <= n; ++i) {
unsigned int x = i;
bool growing = true;
//if (x < 10)
// growing = false;
unsigned int last = x % 10 + 1;
while (x>0) {
unsigned int cur = x % 10;
x /= 10;
if (cur != last - 1)
growing = false;
last = cur;
}
if (growing) {
printf("%i ", i);
}
}
}
設置為false后,您可能會得到一個稍快的版本,但會出現中斷。
無用的咆哮 :我不明白為什么人們在學生了解基本知識之前就繼續教I / O。 不是教學的功能,但是寫一個( main
)沒有意識到這一點,並呼吁其他( scanf
, printf
,無需了解任何指針)。 我很好奇老師如何證明&
。
這是該問題的可能解決方案。 它使用字符串而不是數字,因此效率較低,但可能更易於理解:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, i, j;
char buf[20], c, last;
_Bool ascending;
puts("Enter m and n (m < n):");
scanf("%d %d", &m, &n);
if (m >= n) {
fprintf(stderr, "m must be smaller than n");
exit(EXIT_FAILURE);
}
puts("Output:");
for (i = m; i < n; i++) {
sprintf(buf, "%d", i);
ascending = true;
last = 0;
for (j = 0; buf[j] != 0; j++) {
c = buf[j];
if (last != 0 && last != c - 1) {
ascending = false;
break;
} else {
last = c;
}
}
if (ascending) {
printf("%d ", i);
}
}
return EXIT_SUCCESS;
}
但是,它的輸出看起來略有不同:
Enter m and n (m < n):
1 999
Output:
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789
我不知道實際的規則是什么,因為2到9之間的數字或多或少都比1上升,不是嗎?
這是更大數量的輸出:
Enter m and n (m < n):
1 10000
Output:
1 2 3 4 5 6 7 8 9 12 23 34 45 56 67 78 89 123 234 345 456 567 678 789 1234 2345 3456 4567 5678 6789
所以這是基於算術的另一個版本:
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
_Bool only_consecutive_figures(int number)
{
int figure, last;
for (last = 0; number > 0; number /= 10) {
figure = number % 10;
if ((last != 0 && last != figure + 1) || figure == 0) {
return false;
}
last = figure;
}
return true;
}
int main()
{
int m, n, i;
puts("Enter m and n (m < n):");
scanf("%d %d", &m, &n);
if (m >= n) {
fprintf(stderr, "m must be smaller than n");
exit(EXIT_FAILURE);
}
puts("Output:");
for (i = m; i < n; i++) {
if (only_consecutive_figures(i)) {
printf("%d ", i);
}
}
putchar('\n');
return EXIT_SUCCESS;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.