[英]Find the largest sum of 3 consecutive digits from number
我有一個編寫C程序的任務,該程序查找數字中3個連續數字的最大和。 我寫了它,但是我遇到了麻煩:該程序似乎可以正常工作,但是它沒有正確回答,而是輸入了一些奇怪的數字。 例如,如果輸入為“ 560315”,則響應為“ 155”。 但是,如果我鍵入“ 560415”,答案仍然是“ 155”,而如果我鍵入“ 561315”,則響應將更改為“ 156”。 編碼有問題嗎? 這是代碼:
#include <stdio.h>
int isempt(int a) {
if ((a==' ')||(a=='\n')||(a=='\t')) {
return 1;
}
else return 0;
}
main() {
int a, b, c, d, e, i, maxsum;
a = 0;
b = 0;
c = 0;
d = 0;
maxsum = 0;
i = 0;
int counter = 0; //the variables "numsearch" and "inside" indicate whether program is in the number or outside it
int numsearch = 1;
int inside = 0;
while ((i = getchar())!=EOF) {
if (numsearch==1) {
if (isempt(i)==0) {
numsearch = 0;
inside = 1;
a = i;
counter++;
}
}
else if ((isempt(i)==0)&&(inside==1)) {
if (counter == 1) {
b = i;
counter++;
}
else if (counter == 2) {
c = i;
counter++;
}
else if (counter == 3) {
d = i;
maxsum = a+b+c;
if ((b+c+d) > maxsum) {
maxsum =( b+c+d);
}
a =b;
b = c;
c = d;
counter++;
}
else if (counter == 4) {
d = i;
if ((b+c+d)>maxsum) {
maxsum = b+c+d;
}
a=b;
b=c;
c=d;
}
}
else if ((counter>=3)&&(isempt(i)==1)) {
printf("\n%d\n", maxsum );
counter = 0;
numsearch = 1;
inside = 0;
a = 0;
b = 0;
c = 0;
d = 0;
}
else {
counter = 0;
numsearch = 1;
inside = 0;
a = 0;
b = 0;
c = 0;
d = 0;
}
}
}
要解決此問題,每當您使用變量i
值將其分配給算法變量: a
, b
, c
, d
,都可以從i
減去48
,在這種情況下,示例560316的答案為11,我相信這是3個連續數字的最大和,這將起作用,因為48
是數字0的ascii代碼,49是數字1的數字,依此類推,因此您的代碼應如下所示:
#include <stdio.h>
int isempt(int a) {
if ((a==' ')||(a=='\n')||(a=='\t')) {
return 1;
}
else return 0;
}
void main() {
int a, b, c, d, e, i, maxsum;
a = 0;
b = 0;
c = 0;
d = 0;
maxsum = 0;
i = 0;
int counter = 0; //the variables "numsearch" and "inside" indicate whether program is in the number or outside it
int numsearch = 1;
int inside = 0;
while ((i = getchar())!=EOF) {
if (numsearch==1) {
if (isempt(i)==0) {
numsearch = 0;
inside = 1;
a = i - '0';
counter++;
}
}
else if ((isempt(i)==0)&&(inside==1)) {
if (counter == 1) {
b = i - '0' ;
counter++;
}
else if (counter == 2) {
c = i - '0';
counter++;
}
else if (counter == 3) {
d = i - '0';
maxsum = a+b+c;
if ((b+c+d) > maxsum) {
maxsum =( b+c+d);
}
a =b;
b = c;
c = d;
counter++;
}
else if (counter == 4) {
d = i - '0' ;
if ((b+c+d)>maxsum) {
maxsum = b+c+d;
}
a=b;
b=c;
c=d;
}
}
else if ((counter>=3)&&(isempt(i)==1)) {
printf("\n%d\n", maxsum );
counter = 0;
numsearch = 1;
inside = 0;
a = 0;
b = 0;
c = 0;
d = 0;
}
else {
counter = 0;
numsearch = 1;
inside = 0;
a = 0;
b = 0;
c = 0;
d = 0;
}
}
}
您有太多嵌套的條件句,我想您可能會感到困惑。 我相信創建整數數組會更容易,並且在數組的每個索引處將其初始化為零。 然后將由索引指示的數字加上一個索引(第一個數字表示第0個索引,第二個數字表示第一個索引,等等)和該前兩個索引(如果存在,則必須進行邊界檢查)。 然后,只需查找並打印陣列中最大的數字即可。
@TD涵蓋了主要問題:使用a = i - '0'
'0 a = i - '0'
而不是a = i
。 (在4個地方)
@喬納·尼爾森(Jonah Nelson)確實指出嵌套有點過多。 下面是一個簡化的版本。
OP代碼確實遇到了既不是空格也不是數字的文本問題。
#include <stdio.h>
#include <ctype.h>
int main() {
int ch;
int index = 0;
char history[2];
int maxsum = -1;
int sum = 0; // running sum
while ((ch = getchar()) != EOF) {
if (isdigit(ch)) {
ch -= '0'; // Convert text code to `int` value.
sum += ch;
if (index >= 2) {
if (sum > maxsum) {
maxsum = sum;
}
sum -= history[0];
history[0] = history[1];
history[1] = ch;
}
else {
history[index++] = ch;
}
}
else {
if (!isspace(ch)) {
printf("Unexpected text '%c'\n", ch);
}
index = 0;
sum = 0;
}
}
printf("Maximum sum: %d\n", maxsum);
return maxsum < 0;
}
如果您想要一個非常簡單的程序,則無需索引到數組中。 請記住最后兩位數字。 從而:
#include <stdio.h>
#include <ctype.h>
int main()
{
int ch;
int count = 0;
int first = 0;
int second = 0;
int sum = 0; /* running sum */
int max_sum = 0; /* max sum */
while (ch = getchar(), ch != EOF)
{
if (isdigit(ch))
{
++count;
ch -= '0'; /* Convert text code to `int` value. */
sum += ch;
if (sum > max_sum)
{
max_sum = sum;
}
sum -= first;
first = second;
second = ch;
}
else
{
printf("Ignored unexpected text '%c'\n", ch);
/* Optionally reset first, second, sum and count to 0 */
}
}
printf("Maximum sum: %d\n", max_sum);
return count < 3; /* Didn't get enough characters */
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.