请问如何用C语言产生一个四位无重复数字的四位数?
发布网友
发布时间:2022-04-24 02:56
我来回答
共5个回答
热心网友
时间:2023-10-23 06:35
可以先把0-9放入一个数组,然后对第一位,随机生成一个10以内的数如:rand()%8+1(避免高位是0的情况),产生的随机数来取数组中的数,并把数组在该位置以后的数前移,即删掉该数字。。第二位用rand()%8,得到,从数组中取出该对应位置的数字作为第二位,然后删掉该数组。。。第三位用rand()%7,第四位用rand()%6。。。这样就可以生成一个四位无重复数字的四位数了
热心网友
时间:2023-10-23 06:35
楼上采用rand生成的是数组下标来取不同的数,这个方法不错,但是数组移位过于繁琐。如果对随即产生的后几位数字与前几位进行比较,相同则重新选择,就省了不少步骤和时间。
我的程序如下,因手头没有编译软件,未曾测试,请楼主试验。如有疏漏,敬请见谅!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int a[4];
int i,j;
int k;
srand(time(NULL));
do
{
a[0]=rand()%10;//产生首位随机数,对10取模得0~9的数字
}
while(a[0]==0);//若首位为零则重新选择
for(i = 1;i < 4; i++)
{
do
{
a[i]=rand()%10;//产生其它几位随机数
k=0;//置标记位为零,表示两数字相同
for(j = 0; j < i; j++)
{
if(a[i]==a[j])//若与前几位相同则跳出,重置a[i]
break;
else
k=1;//若不同,则该位有效,置标记k为1
}
}while(k!=1);
}
//输出结果,下面用k来表示该四位数,将a[4]转换为int的k
k=a[0];
for(i=1;i<4;i++)
{
k=k*10+a[i];
}
printf("%d ",k);
}
百度知道把我每一行前面的空格都删除了,程序可读性就差了,请楼主自行缩进各行。
热心网友
时间:2023-10-23 06:36
#include<stdio.h>
void main()
{
int i, j, k, m, n = 0;
for(i=1; i<10; i++)
for(j=0; j<10; j++)
for(k=0; k<10; k++)
for(m=0; m<10; m++)
if((i != j) && (i != k) && (i != m) && (j != k) && (j != m) && (k != m))
{
printf("%d%d%d%d ",i,j,k,m);
n++;
}
printf("\n四位无重复数字的四位数总共有%d个\n",n);
}
热心网友
时间:2023-10-23 06:36
我也写了一个,运行了没问题,我是根据一楼的算法写的。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int j,n,e,b,c,d;
srand((unsigned)time(NULL));
n=rand()%9+1;
e=a[n];
for(;n<=8;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%8;
b=a[n];
for(;n<=7;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%7;
c=a[n];
for(;n<=6;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%6;
d=a[n];
j=e*1000+b*100+c*10+d;
printf("这个随机的四位数为:%d",j);
}
热心网友
时间:2023-10-23 06:37
我觉得四楼写的程序简单易懂,适合初学者。而且可行。如果用VC编还得在
printf("\n四位无重复数字的四位数总共有%d个\n",n); 后加一行return;
编译就没问题了。
热心网友
时间:2023-10-23 06:35
可以先把0-9放入一个数组,然后对第一位,随机生成一个10以内的数如:rand()%8+1(避免高位是0的情况),产生的随机数来取数组中的数,并把数组在该位置以后的数前移,即删掉该数字。。第二位用rand()%8,得到,从数组中取出该对应位置的数字作为第二位,然后删掉该数组。。。第三位用rand()%7,第四位用rand()%6。。。这样就可以生成一个四位无重复数字的四位数了
热心网友
时间:2023-10-23 06:35
楼上采用rand生成的是数组下标来取不同的数,这个方法不错,但是数组移位过于繁琐。如果对随即产生的后几位数字与前几位进行比较,相同则重新选择,就省了不少步骤和时间。
我的程序如下,因手头没有编译软件,未曾测试,请楼主试验。如有疏漏,敬请见谅!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int a[4];
int i,j;
int k;
srand(time(NULL));
do
{
a[0]=rand()%10;//产生首位随机数,对10取模得0~9的数字
}
while(a[0]==0);//若首位为零则重新选择
for(i = 1;i < 4; i++)
{
do
{
a[i]=rand()%10;//产生其它几位随机数
k=0;//置标记位为零,表示两数字相同
for(j = 0; j < i; j++)
{
if(a[i]==a[j])//若与前几位相同则跳出,重置a[i]
break;
else
k=1;//若不同,则该位有效,置标记k为1
}
}while(k!=1);
}
//输出结果,下面用k来表示该四位数,将a[4]转换为int的k
k=a[0];
for(i=1;i<4;i++)
{
k=k*10+a[i];
}
printf("%d ",k);
}
百度知道把我每一行前面的空格都删除了,程序可读性就差了,请楼主自行缩进各行。
热心网友
时间:2023-10-23 06:36
#include<stdio.h>
void main()
{
int i, j, k, m, n = 0;
for(i=1; i<10; i++)
for(j=0; j<10; j++)
for(k=0; k<10; k++)
for(m=0; m<10; m++)
if((i != j) && (i != k) && (i != m) && (j != k) && (j != m) && (k != m))
{
printf("%d%d%d%d ",i,j,k,m);
n++;
}
printf("\n四位无重复数字的四位数总共有%d个\n",n);
}
热心网友
时间:2023-10-23 06:35
可以先把0-9放入一个数组,然后对第一位,随机生成一个10以内的数如:rand()%8+1(避免高位是0的情况),产生的随机数来取数组中的数,并把数组在该位置以后的数前移,即删掉该数字。。第二位用rand()%8,得到,从数组中取出该对应位置的数字作为第二位,然后删掉该数组。。。第三位用rand()%7,第四位用rand()%6。。。这样就可以生成一个四位无重复数字的四位数了
热心网友
时间:2023-10-23 06:36
我也写了一个,运行了没问题,我是根据一楼的算法写的。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int j,n,e,b,c,d;
srand((unsigned)time(NULL));
n=rand()%9+1;
e=a[n];
for(;n<=8;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%8;
b=a[n];
for(;n<=7;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%7;
c=a[n];
for(;n<=6;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%6;
d=a[n];
j=e*1000+b*100+c*10+d;
printf("这个随机的四位数为:%d",j);
}
热心网友
时间:2023-10-23 06:35
楼上采用rand生成的是数组下标来取不同的数,这个方法不错,但是数组移位过于繁琐。如果对随即产生的后几位数字与前几位进行比较,相同则重新选择,就省了不少步骤和时间。
我的程序如下,因手头没有编译软件,未曾测试,请楼主试验。如有疏漏,敬请见谅!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int a[4];
int i,j;
int k;
srand(time(NULL));
do
{
a[0]=rand()%10;//产生首位随机数,对10取模得0~9的数字
}
while(a[0]==0);//若首位为零则重新选择
for(i = 1;i < 4; i++)
{
do
{
a[i]=rand()%10;//产生其它几位随机数
k=0;//置标记位为零,表示两数字相同
for(j = 0; j < i; j++)
{
if(a[i]==a[j])//若与前几位相同则跳出,重置a[i]
break;
else
k=1;//若不同,则该位有效,置标记k为1
}
}while(k!=1);
}
//输出结果,下面用k来表示该四位数,将a[4]转换为int的k
k=a[0];
for(i=1;i<4;i++)
{
k=k*10+a[i];
}
printf("%d ",k);
}
百度知道把我每一行前面的空格都删除了,程序可读性就差了,请楼主自行缩进各行。
热心网友
时间:2023-10-23 06:37
我觉得四楼写的程序简单易懂,适合初学者。而且可行。如果用VC编还得在
printf("\n四位无重复数字的四位数总共有%d个\n",n); 后加一行return;
编译就没问题了。
热心网友
时间:2023-10-23 06:36
#include<stdio.h>
void main()
{
int i, j, k, m, n = 0;
for(i=1; i<10; i++)
for(j=0; j<10; j++)
for(k=0; k<10; k++)
for(m=0; m<10; m++)
if((i != j) && (i != k) && (i != m) && (j != k) && (j != m) && (k != m))
{
printf("%d%d%d%d ",i,j,k,m);
n++;
}
printf("\n四位无重复数字的四位数总共有%d个\n",n);
}
热心网友
时间:2023-10-23 06:36
我也写了一个,运行了没问题,我是根据一楼的算法写的。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int j,n,e,b,c,d;
srand((unsigned)time(NULL));
n=rand()%9+1;
e=a[n];
for(;n<=8;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%8;
b=a[n];
for(;n<=7;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%7;
c=a[n];
for(;n<=6;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%6;
d=a[n];
j=e*1000+b*100+c*10+d;
printf("这个随机的四位数为:%d",j);
}
热心网友
时间:2023-10-23 06:37
我觉得四楼写的程序简单易懂,适合初学者。而且可行。如果用VC编还得在
printf("\n四位无重复数字的四位数总共有%d个\n",n); 后加一行return;
编译就没问题了。
热心网友
时间:2023-10-23 06:35
可以先把0-9放入一个数组,然后对第一位,随机生成一个10以内的数如:rand()%8+1(避免高位是0的情况),产生的随机数来取数组中的数,并把数组在该位置以后的数前移,即删掉该数字。。第二位用rand()%8,得到,从数组中取出该对应位置的数字作为第二位,然后删掉该数组。。。第三位用rand()%7,第四位用rand()%6。。。这样就可以生成一个四位无重复数字的四位数了
热心网友
时间:2023-10-23 06:35
楼上采用rand生成的是数组下标来取不同的数,这个方法不错,但是数组移位过于繁琐。如果对随即产生的后几位数字与前几位进行比较,相同则重新选择,就省了不少步骤和时间。
我的程序如下,因手头没有编译软件,未曾测试,请楼主试验。如有疏漏,敬请见谅!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int a[4];
int i,j;
int k;
srand(time(NULL));
do
{
a[0]=rand()%10;//产生首位随机数,对10取模得0~9的数字
}
while(a[0]==0);//若首位为零则重新选择
for(i = 1;i < 4; i++)
{
do
{
a[i]=rand()%10;//产生其它几位随机数
k=0;//置标记位为零,表示两数字相同
for(j = 0; j < i; j++)
{
if(a[i]==a[j])//若与前几位相同则跳出,重置a[i]
break;
else
k=1;//若不同,则该位有效,置标记k为1
}
}while(k!=1);
}
//输出结果,下面用k来表示该四位数,将a[4]转换为int的k
k=a[0];
for(i=1;i<4;i++)
{
k=k*10+a[i];
}
printf("%d ",k);
}
百度知道把我每一行前面的空格都删除了,程序可读性就差了,请楼主自行缩进各行。
热心网友
时间:2023-10-23 06:36
#include<stdio.h>
void main()
{
int i, j, k, m, n = 0;
for(i=1; i<10; i++)
for(j=0; j<10; j++)
for(k=0; k<10; k++)
for(m=0; m<10; m++)
if((i != j) && (i != k) && (i != m) && (j != k) && (j != m) && (k != m))
{
printf("%d%d%d%d ",i,j,k,m);
n++;
}
printf("\n四位无重复数字的四位数总共有%d个\n",n);
}
热心网友
时间:2023-10-23 06:36
我也写了一个,运行了没问题,我是根据一楼的算法写的。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int j,n,e,b,c,d;
srand((unsigned)time(NULL));
n=rand()%9+1;
e=a[n];
for(;n<=8;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%8;
b=a[n];
for(;n<=7;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%7;
c=a[n];
for(;n<=6;n++)
a[n]=a[n+1];
srand((unsigned)time(NULL));
n=rand()%6;
d=a[n];
j=e*1000+b*100+c*10+d;
printf("这个随机的四位数为:%d",j);
}
热心网友
时间:2023-10-23 06:37
我觉得四楼写的程序简单易懂,适合初学者。而且可行。如果用VC编还得在
printf("\n四位无重复数字的四位数总共有%d个\n",n); 后加一行return;
编译就没问题了。