程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva--10700

uva--10700

編輯:C++入門知識

uva--10700


題意:

輸入一串只含有+和*號的表達式,可以通過添加括號來改變表達式的值,求表達式的最大最小值。

思路:

表達式中的數都是不大於20的正整數,由a*b+c<=a*(b+c)可以知道,先算乘法後算加法時表達式的值最小,

先算加法後算乘法時表達式的值最大。

由這個思路,我先把表達式中的運算符和數字都提取出來放在棧中,然後根據兩種情況進行計算。

可以寫出代碼後WA了無數次就是過不了。。。。。。

下面的AC代碼是看了別人的題解後模仿寫出的,其主要的思路是一樣,但是他用數組模擬了棧,

然後直接在從表達式中提取數據的過程中進行了計算;我覺得他思路比較巧妙的一點是,在第一個數字前

就假設了一個運算符,將第一個數字和其他的數字在形式上統一了起來,這樣大大的簡化了處理過程。

另外這個題目的結果比較大,需要用double類型來保存。


代碼如下:


#include
#include
#include
#include
using namespace std;

int main()
{
     int i,j,k,t;
     char str[100];
     double min,max,stack[30];
     scanf("%d",&t);
     while(t--)
     {
           scanf("%s",str);
           i=0; min=0;max=1.0;
           int top=0;
           char ch='+';
           while(str[i]!='\0')
           {
                   k=0;
                   while(str[i]>='0'&&str[i]<='9')
                   {
                           k=k*10+str[i]-'0';
                           i++;
                   }
                   if(ch=='+')
                           stack[++top]=k;
                   else
                           stack[top]*=k;
                    if(str[i]!='\0')
                          ch=str[i++];
           }
           for(i=1;i<=top;i++)
                min+=stack[i];
            top=0; i=0; ch='*';
            while(str[i]!='\0')
            {
                   k=0;
                   while(str[i]>='0'&&str[i]<='9')
                   {
                           k=k*10+str[i]-'0';
                           i++;
                   }
                   if(ch=='*')
                         stack[++top]=k;
                    else
                         stack[top]+=k;
                    if(str[i]!='\0')
                         ch=str[i++];
            }
            for(i=1;i<=top;i++)
                    max*=stack[i];
            printf("The maximum and minimum are %0.lf and %0.lf.\n",max,min);
     }
 return 0;
}

找不到錯誤的WA代碼如下:


#include
#include
#include
#include
using namespace std;

int main()
{
    char str[10000];
    int i,j,k,t;
    double a[10000];
    scanf("%d",&t);
    while(t--)
    {
        stacks1,s2;
        stacks3,s4;
        scanf("%s",str);
        double minnum=0,maxnum=1;
        int len=strlen(str);
        k=0;
        for(i=0;i=len)
        {
            printf("The maximum and minimum are %d and %d.\n",k,k);
            continue;
        }
        for(i=0;i


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved