正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12
(1)、设计一个函数void generate(int a,int b,int N ,int * Q)计算Q的前几项(2)、设计测试数据来验证函数程序在各种输入下的正确性。
ps:由于笔者水平有限,如有错误,或者有更好的解决办法,还望各位道友批评指正。
转载请注明出处,并请勿用于商业用途。
#include<stdio.h>
void generate(int a,int b,int N ,int * Q)
{
//错误处理
if((a<=0 && b<=0 ) || Q==NULL || N<=0)
return ;
int a_i=0;
int b_i=0;
int Q_i=0;
bool a_iszero=false;
bool b_iszero=false;
if(a==0)
a_iszero=true;
if(b==0)
b_iszero=true;
//a,b 都非零的情况,做为第一个判断条件是因为两个数都是正整数的概率比较大
if(!a_iszero && !b_iszero)
{
while ((a_i+b_i)<N)
{
if(a_i*a+a < b+b*b_i)
{
*(Q+Q_i)=a+a*a_i;
printf("%d ",*(Q+Q_i));
Q_i++;
a_i++;
}
else if(a_i*a+a > b+b*b_i )
{
*(Q+Q_i)=b+b*b_i;
printf("%d ",*(Q+Q_i));
Q_i++;
b_i++;
}
else
{
//相等的情况处理,如果不处理,会有重复输出
a_i++;//b_i++也可以
N++;
}
}
}
//a!=0 , b==0 的情况
else if( !a_iszero)
{
while(a_i<N)
{
*(Q+Q_i)=a+a*a_i;
printf("%d ",*(Q+Q_i));
Q_i++;
a_i++;
}
}
//a==0,b!=0 的情况
else
{
while(b_i<N)
{
*(Q+Q_i)=b+b*b_i;
printf("%d ",*(Q+Q_i));
Q_i++;
b_i++;
}
}
printf("\n");
}
int main()
{
int Q[12];
// abN为非正整数以及Q==NULL的数据不进行测试,
//因为在函数中的第一句已经已经判断了。
generate( 4,5,5,Q);
generate( 2,4,6,Q);
generate( 2,0,7,Q);
generate( 0,2,8,Q);
generate( 2,103,9,Q);
getchar();
return 0;
}