写在最前:这是我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
#include
#include
//定义将数字字符转化为整型数字的函数,分割出来个位数时,用这个会方便许多
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
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
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
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
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
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
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
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
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
#include
#include
//定义求乘积最大的函数
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
k=0;
for(j=0;j
a[k++]=s[j];
a[k]='\0';//最后一定要加 \0
s1=atoi(a);//字符串转数字
k=0;
for(j=i;j
a[k++]=s[j];
a[k]='\0';
s2=atoi(a);
t=s1*s2;
if(m
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;
}
运行测试: