1. 程式人生 > 實用技巧 >c:乘號

c:乘號

寫在最前:這是我c語言暑假作業的最後一題了,我幾乎是一天完成一題沒有間斷過,除了在火車上的特殊情況。這意味著我的暑假接近尾聲了,期待我的大二新生活。

28、任意給一個9位整數;再在其中插入4個乘號,使分得的5個整數的乘積最大;

輸入:正整數n;

輸出:被分得的5個整數、得到的最大乘積值。

另:試編寫一方法,任給一個自然數(不定長、以字串的形式作為此方法的引數),程式設計確定在其中插入一個乘號(),使得被分割的兩個自然數之積最大,要求輸出其二者相乘的算式形式。(如7282144:7282144=5914368)

題目分析:
在9位數中插入4個乘號
我忍不住想起了我做的第19題
那題要求在一個6位數中隨機插入2個加號
然後相加求最大值
我就把加號在不同位置的情況都寫了一遍
那叫一個麻煩
今天這題很相似
不過更復雜
這麼長的數字
我肯定是用字串來處理了
可是想起上一次把陣列轉換為整型數字時的麻煩
我決定找方法簡化
運氣不錯,
我學到了一個新的庫函式

int atoi(const char *str)

開頭要匯入標頭檔案 stdlib.h
這個函式可以把字串轉換為整型的數字
我用字串輸入的9位數
插入4個乘號後分割為5個數字
我只需要把字串分割,
轉換為整型數字然後相乘
找出數值最大的就可以了
至於第2題
輸入任意長度的數字
用字串儲存
然後分割為兩個部分
轉換為整數再相乘
把所有的情況產生的值進行比較
找出最大值
我給題目標出重點:

分割示意圖:

紙上談兵結束,
第一題程式碼如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//定義將數字字元轉化為整型數字的函式,分割出來個位數時,用這個會方便許多
int fun(char c){
    int a=c-'0';
    return a;
}

//定義求乘積最大的函式
void max(char *s){
    char a[10];//分割的時候可能會用到這個的字串
    int s1,s2,s3,s4,s5,i,j,k,t,m1,m2,m3,m4,m5,m=0;//s1~s5記錄分割後的5個數字

    //最後一個乘號不確定的狀態
    s1=fun(s[0]);//單個字元轉數字
    s2=fun(s[1]);
    s3=fun(s[2]);
    for(i=4;i<9;i++){
        j=0;
        for(k=3;k<i;k++)
            a[j++]=s[k];//分割出第4個數字
        a[j]='\0';//字串最後一定要加上 '\0' 來表示結束,我一開始沒有加導致計算出錯
        s4=atoi(a);
        j=0;
        for(k=i;k<9;k++)
            a[j++]=s[k];//分割出第5個數字
        a[j]='\0';
        s5=atoi(a);
        t=s1*s2*s3*s4*s5;
        if(m<t){
            m=t;//用打擂臺的方法確定最大值
            m1=s1;m2=s2;m3=s3;m4=s4;m5=s5;
        }    
    }
    
    //倒數第2個乘號不確定的狀態
    s1=fun(s[0]);//單個字元轉數字
    s2=fun(s[1]);
    s5=fun(s[8]);
    for(i=3;i<8;i++){
        j=0;
        for(k=2;k<i;k++)
            a[j++]=s[k];//分割出第3個數字
        a[j]='\0';
        s3=atoi(a);
        j=0;
        for(k=i;k<8;k++)
            a[j++]=s[k];//分割出第4個數字
        a[j]='\0';
        s4=atoi(a);
        t=s1*s2*s3*s4*s5;
        if(m<t){
            m=t;//用打擂臺的方法確定最大值
            m1=s1;m2=s2;m3=s3;m4=s4;m5=s5;
        }    
    }

    //第2個乘號不確定的狀態
    s1=fun(s[0]);//單個字元轉數字
    s4=fun(s[7]);
    s5=fun(s[8]);
    for(i=2;i<7;i++){
        j=0;
        for(k=1;k<i;k++)
            a[j++]=s[k];//分割出第2個數字
        a[j]='\0';
        s2=atoi(a);
        j=0;
        for(k=i;k<7;k++)
            a[j++]=s[k];//分割出第3個數字
        a[j]='\0';
        s3=atoi(a);
        t=s1*s2*s3*s4*s5;
        if(m<t){
            m=t;//用打擂臺的方法確定最大值
            m1=s1;m2=s2;m3=s3;m4=s4;m5=s5;
        }    
    }

    //第2個乘號不確定的狀態
    s3=fun(s[6]);//單個字元轉數字
    s4=fun(s[7]);
    s5=fun(s[8]);
    for(i=1;i<6;i++){
        j=0;
        for(k=0;k<i;k++)
            a[j++]=s[k];//分割出第1個數字
        a[j]='\0';
        s1=atoi(a);
        j=0;
        for(k=i;k<6;k++)
            a[j++]=s[k];//分割出第2個數字
        a[j]='\0';
        s2=atoi(a);
        t=s1*s2*s3*s4*s5;
        if(m<t){
            m=t;//用打擂臺的方法確定最大值
            m1=s1;m2=s2;m3=s3;m4=s4;m5=s5;
        }    
    }

    //列印結果
    printf("%d*%d*%d*%d*%d=%d\n",m1,m2,m3,m4,m5,m);
}

int main(){
    //定義變數,輸入資料
    char s[80];
    printf("輸入一個9位整數:\n");
    scanf("%s",s);
    
    //呼叫函式計算結果    
    max(s);
    return 0;
}

執行測試:

這麼大的數字
運算結果是否準確我無法判斷
不過我數字分割的結果貌似是對的
第二題程式碼如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//定義求乘積最大的函式
void max(char *s){
    char a[80];//a臨時儲存分割的字串,字串轉整型時數字會用到
    int m1,m2,m=0,s1,s2,i,j,k,t,len;//定義一些要用到的變數
    len=strlen(s);//輸入的長度是任意的,可以用這個函式確定

    for(i=1;i<len;i++){
        k=0;
        for(j=0;j<i;j++)//s1位於第1個數到i
            a[k++]=s[j];
        a[k]='\0';//最後一定要加 \0
        s1=atoi(a);//字串轉數字
        k=0;
        for(j=i;j<len;j++)//s2位於第1個數到最後
            a[k++]=s[j];
        a[k]='\0';
        s2=atoi(a);
        t=s1*s2;
        if(m<t){
            m=t;//打擂臺法求最大值
            m1=s1;
            m2=s2;
        }
    }
    
    //列印結果
    printf("%d*%d=%d\n",m1,m2,m);
}

int main(){
    //定義變數,輸入資料
    char s[80];
    printf("輸入一個整數:\n");
    scanf("%s",s);
    
    //呼叫函式計算結果    
    max(s);
    return 0;
}

執行測試: