由于上一次输入数组出错,本次更正。
设计思想:
1.输入字符串数组
2.将字符串数组赋初值删去空格、换行以及初值,将其他字符转化成整数数组储存起来。
3.环形整数数组在每一个点出都可能断开,所以设置两个循环,借用第一次计算一个一维数组的子数组最大和
4.从每一个点都开始一次计算出每一个一维数组的子数组最大和,比较哪一个最大,输出。
#include <iostream> #include <stdio.h> using namespace std; #define max 100 #define no -9999 int main() { int ary[max]; char record[max]; int length=0; //数组的长度,忘记赋初值出错了 for(int i=0;i<max;i++) { record[i]='a'; } cout <<"请输入整数数组:"; //输入 for(int i=1;i<max;i++) //使用字符串记录,从1开始,计算两位数时避免前一个字符串不存在。 { record[i]=getchar(); if(record[i]==' ') break; } for(int i=1;i<max;i++) { if(record[i]=='a') break; if(record[i]!=' '&&record[i]!=' ') //将记录的字符串删除空格、换行以及空字符其余转化为整数数组 { if(record[i]=='-') //如果有负号则删去字符串-,在数字上添加- { if(record[i+2]!=' '&&record[i+2]!='a'&&record[i+2]!=' ') //没有考虑 换行符 出错了 { ary[length]=-(((record[i+1]-48)*10)+(record[i+2]-48)); length++; i=i+2; } else { ary[length]=-(record[i+1]-48); length++; i=i+1; } } else { if(record[i-1]!=' '&&record[i-1]!='a') //对于两位数的转化 { ary[length]=(record[i-1]-48)*10+(record[i]-48); length++; } else { if((record[i-1]==' '&&record[i+1]==' ')||record[i-1]=='a') //没有考虑第一个字符的前一个为 a导致缺乏第一个 { ary[length]=record[i]-48; length++; } } } } } /*cout <<"请输入数组长度:"; cin>>length; cout <<"请输入"<<length<<"个整数:"<<endl; for(int i=0;i<length;i++) cin>>ary[i];*/ for(int i=length;i<2*length-1;i++) //检查是否是转化为想要的数组 { ary[i]=ary[i%length]; } for(int i=0;i<2*length-1;i++) cout <<ary[i]<<" "; cout<<endl; int Max=0; for(int i=0;i<length;i++) //环形数组断开的位置 { int sum=0; for(int j=i;j<i+length;j++) //每次断开计算子数组的最大和 { if(sum<=0) sum=ary[j]; else sum=sum+ary[j]; if(Max<sum) //每次最大和比较选出最大的 Max=sum; } } cout <<"该整数数组中子数组最大值为:"<<Max<<endl; return 0; }
总结:
在使用字符串记录输入的字符并转化为整数的过程中遇到了很多问题。
1.字符是一个一个的,但是整数有两位也有负数,在转化的时候很费劲。
2.经常忽视特殊情况
3.忘记赋初值
对于字符串和整数之间的转化已经很熟悉了。