问题1:有两个全为数字的字符串,计算它们乘积的结果
问题2:有一个int型数组,每一项取值为-100到100,无序排列。如何截出和最大的一段。
一小时内
第二个问题:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int source[100], i, j, k, iTemp, iSum=0, iLocation, iLength;
srand((unsigned)time(NULL));
for(i=0; i<=99; ++i) source[i] = rand()%201-100;
for(i=1; i<=100; ++i)
{
for(j=0; j<=100-i; ++j)
{
iTemp = 0;
for(k=0; k<=i-1; ++k) iTemp += source[j+k];
if(iTemp > iSum) iSum = iTemp, iLocation = j, iLength = i;
}
}
printf("Sum of the section started from source[%d] which contains %d elements is the biggest!", iLocation, iLength);
return 0;
}
简单啊,动态规划就行了,遍历一遍就能搞定
int Fmaxsum(int a[],int n)
{
int sum=0;
int b=0;
for(int i=0;i<n;i++)
{
if(b>0)
b+=a[i];
else
b=a[i];
if(b>sum)
sum=b;
}
return sum;
}
void main()
{
int a[]={1,2,3,4,-1,3,-7,5,1};
cout<<Fmaxsum(a,9);
}
void Fmaxsum(int a[],int n)
{
int sum=0;
int begin=0,end=0;
int b=0;
for(int i=0;i<n;i++)
{
if(b>0)
{
b+=a[i];
}
else
{
b=a[i];
begin=end=i;
}
if(b>sum)
{
sum=b;
end=i;
}
}
cout<<"最大段数据为"<<endl;
for(i=begin;i<=end;i++)
cout<<a[i]<< ;
cout<<endl<<"值为"<<sum<<endl;
}
void main()
{
int a[]={1,-2,3,4,-1,3,-4,5,-7,1};
Fmaxsum(a,10);
}
问题2:
#include <stdio.h>
#define n 10 //定义数组个数;
void main()
{
int a[n],i,j; //定义一个数组和两个循环变量
int b,sum; //定义SUM为最大一段数组的值;b为存放随机数组段的值
int x,y; //定义x和y为数组段的起始下标和终止下标;
b=0; sum=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(j=0;j<n;j++)
{
for(i=j;i<n;i++)
{
b=b+a[i];
if(b>sum)
{
sum=b;
x=j;
y=i; }
}
b=0;
}
printf("sum=%d\n",sum);
printf("a[%d]-a[%d]是最大的数组段",x,y);
}
程序的算法是将每个有可能的数组段的值保留最大值在sum里;
程序没有仔细检查,只是测试了几个数组都成功;
问题一:有两个全为数字的字符串,计算它们乘积的结果
这个程序可以计算100位的乘法
#include <stdio.h>
#include <string.h>
#include <math.h>
void aa(char *,int,char *);
int main()
{
char a[100],b[100],c[200];
int i,flag=0;
gets(a);
gets(b);
for(i=0;i<=199;i++) c[i]=0;
for(i=0;i<=strlen(b)-1;i++) aa(a,b[i]-0,c);
for(i=0;i<=199;i++)
{
if(c[i]==0&&flag==0) continue;
flag=1;
printf("%c",c[i]);
}
}
void aa(char *p,int x,char *q)
{
int xx,j,jj,m,w=0;
for(j=1;j<=199;j++) q[j-1]=q[j];
q[199]=0;
for(j=strlen(p)-1;j>=0;j--)
{
m=(p[j]-0)*x+w+q[199-(strlen(p)-j-1)]-0;
xx=m%10;
w=floor(m/10);
q[199-(strlen(p)-j-1)]=xx+0;
}
while(w!=0)
{
m=q[199-(strlen(p)-j-1)]-0+w;
xx=m%10;
w=floor(m/10);
q[199-(strlen(p)-j-1)]=xx+0;
j--;
}
}
szws(克米帅) 的方法不错,呵呵
//修改了下
#include<iostream>
using namespace std;
void Fmaxsum(int a[],int n)
{
int sum=a[0];
int begin=0,end=0;
int b=0,t=0;
for(int i=0;i<n;i++)
{
if(b>0)
{
b+=a[i];
}
else
{
b=a[i];
t=i;
}
if(b>sum||b==sum)
{
sum=b;
begin=t;
end=i;
}
}
cout<<"最大段数据为"<<endl;
for(i=begin;i<=end;i++)
cout<<a[i]<< ;
cout<<endl<<"值为"<<sum<<endl;
}
void main()
{
int a[]={1,-2,3,4,-1,3,-4,5,-7,1};
Fmaxsum(a,10);
}
void FindMax(const int a[], const int n)
{
int i = 0;
int j = 0;
int iSum = 0;
int iStart = 0;
int iAdd = 0;
int iLen = 0;
for (i = 0; i<n; i++)
{
iAdd = 0;
for (j=1; j<=n-i; j++)
{
iAdd += a[j+i-1];
if (iAdd > iSum)
{
iSum = iAdd;
iStart = i;
iLen = j;
}
}
}
}