不拘一格编程序之二

来源:互联网 发布:js点击按钮显示时间 编辑:程序博客网 时间:2024/04/30 20:53
 
题目:一个数组int a[10],要求为每个元素随机赋值0或者1,但是这10个元素不能全0,也不能全1。

方法一:随机产生10个元素,如果都是0,或者都是1,就重新生成。

其中如何判断都是0,还是都是1?
方法一.方法一:用变量n1标志全0,n1=0表示非全0,n1=1表示全0。用变量n2标志全1,n2=0表示非全1,n2=1表示全1.
int n1,n2;
n1 = 1;
n2 = 1;
for (int i=0; i<10; i++)
{
    a[i] = random(2);
    if (a[i] == 0)  n2 = 0 ;
    else n1 = 0;
}
如果发现n1==1 || n2 == 1,那么重新执行以上步骤
方法一.方法二:将a[i]的取值全部加起来,结果为0表示全0,结果为10表示全1。
int sum=0;
for (int i=0; i<10; i++)
{
    a[i] = random(2);
    sum += a[i];
}
如果发现sum==0||sum==10值需要重新执行。

重新执行又有多种表示方法
方法一.方法三:
label1:
n1 = 1;
n2 = 1;
for (int i=0; i<10; i++)
{
    a[i] = random(2);
    if (a[i] == 0)  n2 = 0 ;
    else n1 = 0;
}
if (n1 == 1|| n2 == 1) goto lable1;
方法一.方法四:
n1=1;n2=1;
while (n1==1||n2==1)
{
n1 = 1;
n2 = 1;
for (int i=0; i<10; i++)
{
    a[i] = random(2);
    if (a[i] == 0)  n2 = 0 ;
    else n1 = 0;
}
}
方法一.方法五:
int sum=0;
while(sum=0 || sum==10)
{
sum=0;
for (int i=0; i<10; i++)
{
    a[i] = random(2);
    sum += a[i];
}
}
方法二:重新生成随机数太麻烦了,不如先随机定位确定0的位置,再确定1的位置,然后随机产生其它8个位置的数。
n1是0的位置,n2是1的位置。第一次随机的n1有0~9一共10个位置,第二次则只有9个位置,
int n1,n2;
n1 = random(10);
n2=random(9);
if (n2 >= n1) n2++;   如果n1=3,n2=3,那么n2其实是第4个。同理如果n1=3,n2=4,其实是第5个。
a[n1]=0;
a[n2]=1;
for (int i=0; i<10; i++)
{
    if (i == n1 || i == n2) continue;        这两个已经有了,不用了。
    a[i] = random(2);
}
方法三:与方法二思路相同,不同的是,先全面随机生成10个数,如果全为0的话,再随机选择一个位置生成1;如果全为1的话,在随机选择一个位置生成0.
int n;
int sum=0;
for (int i=0; i<10; i++)
{
    a[i]=random(2);
    sum+=a[i];
}
if (sum==0)
{
    n=random(10);
    a[n]=1;
}
if (sum==10)
{
    n=random(10);
    a[n]=0;
}
当然,上面的程序还可以改为:(把最后的判断合一)。
int n;
int sum=0;
for (int i=0; i<10; i++)
{
    a[i]=random(2);
    sum+=a[i];
}
if (sum==0 || sum == 10)
{
    n=random(10);
    a[n]= sum/10;
}
方法四:利用位运算,随机产生一个1~210-1之间的数,这个数一个10位,而且每为不会全为0(全为0的数是0),也不会全为1(全为1的数是210-1),那么将这个数的每一位的取值赋值到数组a[i]中对应的元素去就可以了。
int u;
u = random(1023) + 1;   如果不加1,是0~1022之间,而我们需要1~1023之间。
for(int i=0; i<10;i++)
{
    a[i] = (u>>i)&1;
}
或者这样:
int u;
u = random(1023) + 1;   如果不加1,是0~1022之间,而我们需要1~1023之间。
for(int i=0; i<10;i++)
{
    a[i] = u&1;
    u=u>>1;
}

当然,实际上还有更多的方法,而每种方法实现也有更多的表示方法,同学们在编程序的时候不要限制了自己的思维,不同的环境下,需要不同的方法。
原创粉丝点击