c:乘號
阿新 • • 發佈:2020-08-16
寫在最前:這是我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; }
執行測試: